Ejecutar una única prueba desde unittest.TestCase a través de la línea de comando
En nuestro equipo, definimos la mayoría de los casos de prueba de esta manera:
Una clase "marco" ourtcfw.py
:
import unittest
class OurTcFw(unittest.TestCase):
def setUp:
# Something
# Other stuff that we want to use everywhere
Y muchos casos de prueba como testMyCase.py:
import localweather
class MyCase(OurTcFw):
def testItIsSunny(self):
self.assertTrue(localweather.sunny)
def testItIsHot(self):
self.assertTrue(localweather.temperature > 20)
if __name__ == "__main__":
unittest.main()
Cuando escribo un nuevo código de prueba y quiero ejecutarlo con frecuencia y ahorrar tiempo, pongo "__" delante de todas las demás pruebas. Pero es engorroso, me distrae del código que estoy escribiendo y el ruido de confirmación que esto crea es simplemente molesto.
Entonces, por ejemplo, al realizar cambios en testItIsHot()
, quiero poder hacer esto:
$ python testMyCase.py testItIsHot
y solounittest
he corrido testItIsHot()
¿Cómo puedo lograr eso?
Intenté reescribir la if __name__ == "__main__":
parte, pero como soy nuevo en Python, me siento perdido y sigo atacando todo lo demás excepto los métodos.
Esto funciona como usted sugiere: solo debe especificar también el nombre de la clase:
python testMyCase.py MyCase.testItIsHot
Si organiza sus casos de prueba, es decir, sigue la misma organización que el código real y también usa importaciones relativas para módulos en el mismo paquete, también puede usar el siguiente formato de comando:
python -m unittest mypkg.tests.test_module.TestClass.test_method
# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot
Documentación de Python 3 para esto: Interfaz de línea de comandos
Puede funcionar bien como supones.
python testMyCase.py MyCase.testItIsHot
Y hay otra manera de simplemente probar testItIsHot
:
suite = unittest.TestSuite()
suite.addTest(MyCase("testItIsHot"))
runner = unittest.TextTestRunner()
runner.run(suite)
Si consulta la ayuda del módulo unittest, le informará sobre varias combinaciones que le permitirán ejecutar clases de casos de prueba desde un módulo y métodos de prueba desde una clase de caso de prueba.
python3 -m unittest -h
[...]
Examples:
python3 -m unittest test_module - run tests from test_module
python3 -m unittest module.TestClass - run tests from module.TestClass
python3 -m unittest module.Class.test_method - run specified test method
```lang-none
It does not require you to define a `unittest.main()` as the default behaviour of your module.
TL;DR : Es muy probable que esto funcione:
python mypkg/tests/test_module.py MyCase.testItIsHot
La explicación :
La manera conveniente
python mypkg/tests/test_module.py MyCase.testItIsHot
funcionaría, pero se supone tácitamente que ya tiene este fragmento de código convencional dentro (normalmente al final) de su archivo de prueba.
if __name__ == "__main__": unittest.main()
La manera inconveniente
python -m unittest mypkg.tests.test_module.TestClass.test_method
siempre funcionaría, sin necesidad de tener ese
if __name__ == "__main__": unittest.main()
fragmento de código en su archivo fuente de prueba.
Entonces, ¿por qué se considera inconveniente el segundo método? Porque sería complicado <insertar una de las partes de tu cuerpo aquí> escribir a mano ese largo camino delimitado por puntos. Mientras que en el primer método, la mypkg/tests/test_module.py
parte se puede completar automáticamente, ya sea mediante un shell moderno o mediante su editor.