es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Simulando un retraso en python unittest para boto3.client y probar el tiempo de espera.

Tengo unas líneas de código aquí:

try:
    client = _get_client(region_name, connect_timeout, read_timeout, max_retries)
except Exception as e:
    log_exception("no se pudo conectar al cliente de param store de boto3", param_name=param_name, err=e)
    return default_value

Y mi método _get_client es muy simple:

def _get_client(region_name, connect_timeout, read_timeout, max_retries):
    config = Config(connect_timeout=connect_timeout,
                    read_timeout=read_timeout,
                    retries={'max_attempts': max_retries})
    return boto3.client("ssm", region_name=region_name, config=config)

Lo que quiero hacer ahora es probar el connect_timeout y el read_timeout en un unittest de Python. ¿Alguien sabe cómo hacer tal cosa? ¿Cómo puedo simular una latencia para conectarme a un boto3.client?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para probar los parámetros connect_timeout y read_timeout en una prueba de unidad de Python, puedes usar el módulo unittest.mock para simular una latencia.

    Aquí tienes un ejemplo:

    import unittest
    from unittest.mock import patch, Mock
    from my_module import _get_client
    
    class TestGetClient(unittest.TestCase):
    
        @patch('my_module.boto3.client')
        def test_get_client(self, mock_boto3_client):
            mock_config = Mock()
            mock_boto3_client.return_value = Mock(__enter__=Mock(return_value=mock_boto3_client),
                                                   __exit__=Mock(return_value=None))
            _get_client('us-west-2', 5, 10, 3)
            mock_boto3_client.assert_called_once_with('ssm', region_name='us-west-2', config=mock_config)
            mock_config.assert_called_once_with(connect_timeout=5, read_timeout=10, retries={'max_attempts': 3})
    
        @patch('my_module.boto3.client')
        def test_connection_timeout(self, mock_boto3_client):
            # simular un tiempo de espera de conexión
            mock_boto3_client.side_effect = ConnectionTimeoutError()
            self.assertEqual(_get_client('us-west-2', 5, 10, 3), None)
    
        @patch('my_module.boto3.client')
        def test_read_timeout(self, mock_boto3_client):
            # simular un tiempo de espera de lectura
            mock_boto3_client.side_effect = ReadTimeoutError()
            self.assertEqual(_get_client('us-west-2', 5, 10, 3), None)
    

    En el primer caso de prueba, utilizamos patch para simular el método boto3.client y su valor de retorno. Luego llamamos a _get_client con algunos argumentos y verificamos que se haya llamado a boto3.client con los argumentos correctos.

    En el segundo caso de prueba, simulamos un ConnectionTimeoutError estableciendo el side_effect de boto3.client. Luego llamamos a _get_client con algunos argumentos y verificamos que devuelva None.

    En el tercer caso de prueba, simulamos un ReadTimeoutError de la misma manera y verificamos que _get_client devuelva None.

    Ten en cuenta que deberás importar las excepciones necesarias (ConnectionTimeoutError, ReadTimeoutError) desde botocore.exceptions.

Comments are closed.