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.

¿Cómo puedo posponer la verificación de pruebas?

Entonces, el problema es el siguiente:
Tengo una clase con pruebas.
Ejemplo de esta clase:

class TestClass:

   def test1(self):

       paso 1 (algún método para crear datos de prueba)
       ...
       ...
       paso n (algún método para crear datos de prueba)

       esperado = resultado de la ejecución del paso 1 ... paso n

       actual = metodo_a()--> obtener resultados reales de algunos recursos (se necesitan 2 min para crear estos datos en este recurso)

       metodo_de_verificacion(esperado, actual) 


   def test2(self):

       paso 1 (algún método para crear datos de prueba)
       ...
       ...
       paso n (algún método para crear datos de prueba)

       esperado = resultado de la ejecución del paso 1 ... paso n

       actual = metodo_a()--> obtener resultados reales de algunos recursos (se necesitan 2 min para crear estos datos en este recurso)

       metodo_de_verificacion(esperado, actual)

Entonces, en ese caso, la ejecución llevará al menos 2 min * número de pruebas.
¿Cómo puedo mover actual = metodo_a()--> obtener resultados reales de algunos recursos (se necesitan 2 min para crear estos datos en este recurso) y como resultado metodo_de_verificacion(esperado, actual) a “algo” que se ejecutará después de todas las pruebas?

Por ahora, tengo una variable global test_name_and_expected_result que contiene esperado para todas las pruebas, y muevo

actual = metodo_a()--> obtener resultados reales de algunos recursos (se necesitan 2 min para crear estos datos en este recurso)

metodo_de_verificacion(esperado, actual)

a la “desconfiguración de la fijación de clase”. Pero como resultado, no tengo un estado de prueba adecuado, ya que solo puedo ver un fracaso general pero no para una prueba específica.

También funciona para mí:
Si existe la posibilidad de sobrescribir forzosamente los resultados de pytest para una prueba específica (ya que tengo el nombre de las pruebas en test_name_and_expected_result).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de tiempo de ejecución prolongado para cada prueba, puedes utilizar un “pytest fixture” que cree los datos de prueba y recupere los resultados reales de la fuente de recursos, y luego pasarlos como argumentos a cada función de prueba. Esto se puede lograr utilizando el decorador @pytest.fixture.

    Aquí tienes un ejemplo de implementación:

    @pytest.fixture
    def test_data_and_actual_results():
        # Código para crear datos de prueba y recuperar resultados reales de la fuente de recursos
        expected1 = resultado del paso 1 ... paso n de ejecución
        actual1 = method_a() --> obtener resultados  reales de algunos recursos (se necesitan 2 minutos para crear estos datos en este recurso)
    
        expected2 = resultado del paso 1 ... paso n de ejecución
        actual2 = method_a() --> obtener resultados  reales de algunos recursos (se necesitan 2 minutos para crear estos datos en este recurso)
    
        yield [(expected1, actual1), (expected2, actual2)]
    
    @pytest.mark.usefixtures("test_data_and_actual_results")
    class TestClass:
        def test1(self, test_data_and_actual_results):
            expected, actual = test_data_and_actual_results[0]
            metodo_de_verificacion(expected, actual)
    
        def test2(self, test_data_and_actual_results):
            expected, actual = test_data_and_actual_results[1]
            metodo_de_verificacion(expected, actual)
    

    En esta implementación, el “pytest fixture” test_data_and_actual_results se utiliza para crear los datos de prueba y recuperar los resultados reales de la fuente de recursos, y devuelve una lista de tuplas, donde cada tupla contiene el resultado esperado y el resultado real para una prueba específica.

    El decorador @pytest.mark.usefixtures("test_data_and_actual_results") se utiliza para inyectar automáticamente el “pytest fixture” test_data_and_actual_results en cada función de prueba como argumento.

    Dentro de cada función de prueba, puedes acceder a los resultados esperados y reales para esa prueba indexando la lista de tuplas devuelta por el “pytest fixture” test_data_and_actual_results. De esta manera, puedes evitar llamar a la función method_a() para cada prueba y en cambio reutilizar los resultados recuperados por el “fixture”.

    Este enfoque te permite ejecutar todas las pruebas utilizando el mismo conjunto de datos de prueba y resultados reales, y reduce el tiempo total de ejecución del conjunto de pruebas.

Comments are closed.