Explicar los métodos de Python "setUp" y "tearDown" utilizados en los casos de prueba

93

¿Alguien puede explicar el uso de los métodos setUpy de Python tearDownal escribir casos de prueba, aparte de que setUpse llama inmediatamente antes de llamar al método de prueba y tearDownse llama inmediatamente después de haber sido llamado?

NOVATO
fuente

Respuestas:

85

En general, agrega todos los pasos de requisitos previos a la configuración y todos los pasos de limpieza a tearDown.

Puede leer más con ejemplos aquí .

Cuando se define un método setUp (), el ejecutor de la prueba ejecutará ese método antes de cada prueba. Asimismo, si se define un método tearDown (), el ejecutor de la prueba invocará ese método después de cada prueba.

Por ejemplo, tiene una prueba que requiere que existan elementos, o cierto estado, por lo que coloca estas acciones (crear instancias de objetos, inicializar db, preparar reglas, etc.) en la configuración.

Además, como sabe, cada prueba debe detenerse en el lugar donde se inició; esto significa que tenemos que restaurar el estado de la aplicación a su estado inicial, por ejemplo, cerrar archivos, conexiones, eliminar elementos recién creados, llamar a transacciones de devolución de llamada, etc. los pasos deben incluirse en el tearDown.

Entonces, la idea es que la prueba en sí debe contener solo acciones que se realizarán en el objeto de prueba para obtener el resultado, mientras que setup y tearDown son los métodos que le ayudarán a dejar su código de prueba limpio y flexible.

Puede crear un setUp y tearDown para un montón de pruebas y definirlas en una clase principal, por lo que sería fácil para usted respaldar dichas pruebas y actualizar las preparaciones y limpiezas comunes.

Si está buscando un ejemplo sencillo, utilice el siguiente enlace con un ejemplo

Artsiom Rudzenka
fuente
54

Puede usarlos para factorizar el código común a todas las pruebas en el conjunto de pruebas.

Si tiene mucho código repetido en sus pruebas, puede acortarlas moviendo este código a setUp / tearDown.

Puede utilizar esto para crear datos de prueba (por ejemplo, configurar falsificaciones / simulacros) o eliminar funciones con falsificaciones.

Si está realizando pruebas de integración, puede usar la verificación de las condiciones previas ambientales en la configuración y omitir la prueba si algo no está configurado correctamente.

Por ejemplo:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())
Matt Curtis
fuente
16
+1 porque las 9 líneas de código es todo lo que necesitaba para asimilar al 100%. Ejemplo elegante y conciso. Para ser honesto, esas 9 líneas son lo único que leo en la página además de la pregunta, que también era mi pregunta. ¿Dijiste algo en inglés antes de la muestra de código? ¡No fue necesario! ¡El código lo decía todo! Gracias Matt.
Nathan C. Tresch
2
No tengo claro cómo se demuestra aquí "omitir la prueba si algo no está configurado correctamente". ¿O fue solo un aparte?
user5359531
6

Suponga que tiene una suite con 10 pruebas. 8 de las pruebas comparten el mismo código de instalación / desmontaje. Los otros 2 no lo hacen.

La configuración y el desmontaje le brindan una buena manera de refactorizar esas 8 pruebas. Ahora, ¿qué haces con las otras 2 pruebas? Los movería a otro caso de prueba / suite. Por lo tanto, el uso de configuración y desmontaje también ayuda a brindar una forma natural de dividir las pruebas en casos / conjuntos

John La Rooy
fuente
1
A veces no se desea trasladar las pruebas a otro caso de prueba. En ese caso, puede escribir un decorador con el código de instalación / desmontaje y solo decorar las funciones de prueba deseadas.
Matthijs
2
Esto de ninguna manera es una respuesta a la pregunta.
gented el