En nuestro equipo, definimos la mayoría de los casos de prueba como este:
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, lo que hago es poner "__" 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 crea es simplemente molesto.
Entonces, por ejemplo, al hacer cambios en testItIsHot()
, quiero poder hacer esto:
$ python testMyCase.py testItIsHot
y solo he unittest
corrido testItIsHot()
¿Cómo puedo lograr eso?
Traté de reescribir la if __name__ == "__main__":
parte, pero como soy nuevo en Python, me siento perdido y sigo criticando todo lo que no sean los métodos.
fuente
__init__.py
dentro de ese directorio (y subdirectorios, si los hay) y llamando, por ejemplo.python test/testMyCase.py test.MyCase.testItIsHot
.Si organiza sus casos de prueba, es decir, siga la misma organización como el código real y también use importaciones relativas para módulos en el mismo paquete
También puede usar el siguiente formato de comando:
Documentación de Python3 para esto: https://docs.python.org/3/library/unittest.html#command-line-interface
fuente
Puede funcionar bien como adivinas
Y hay otra forma de probar
testItIsHot
:fuente
Si consulta la ayuda del módulo unittest, le informa sobre varias combinaciones que le permiten ejecutar clases de caso de prueba desde un módulo y métodos de prueba desde una clase de caso de prueba.
No requiere que defina a
unittest.main()
como el comportamiento predeterminado de su módulo.fuente
usage
es extrañamente inconsistente): la ejecuciónpython -m unittest module_test.TestClass.test_method
asume un archivomodule_test.py
(se ejecuta desde el directorio actual; y no__init.py__
es obligatorio); y contiene cuál contiene (esto también funciona para mí en python 2.7.13)module_test.py
class TestClass(unittest.TestCase)...
def test_method(self,...)
Tal vez, será útil para alguien. En caso de que desee ejecutar solo pruebas de una clase específica:
A mí me funciona en Python 3.6
fuente
Inspirado por @yarkee, lo combiné con parte del código que ya obtuve. También puede llamarlo desde otro script, simplemente llamando a la función
run_unit_tests()
sin necesidad de usar la línea de comando, o simplemente llamándolo desde la línea de comando conpython3 my_test_file.py
.Lamentablemente, esto solo funciona para
Python 3.3
o superior:Código de corredor:
Editando un poco el código, puede pasar una matriz con todas las pruebas unitarias que le gustaría llamar:
Y otro archivo:
Alternativamente, puede usar https://docs.python.org/3/library/unittest.html#load-tests-protocol y definir el siguiente método en su módulo / archivo de prueba:
Si desea limitar la ejecución a un solo archivo de prueba, solo necesita establecer el patrón de descubrimiento de prueba en el único archivo donde definió la
load_tests()
función.Referencias
Alternativamente al último ejemplo del programa principal, se me ocurrió la siguiente variación después de leer la
unittest.main()
implementación del método:fuente
TL; DR : Esto muy probablemente funcionaría:
La explicación :
La manera conveniente
funcionaría PERO su suposición tácita es que ya tiene este fragmento de código convencional dentro (generalmente al final de) su archivo de prueba.
La manera inconveniente
siempre funcionaría, sin requerir que tengas ese
if __name__ == "__main__": unittest.main()
fragmento de código en tu archivo fuente de prueba.Entonces, ¿por qué el segundo método se considera inconveniente? Porque sería un dolor en el (_ inserte una de las partes de su 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 por un shell moderno o por su editor.PD: Si pensabas que esa parte del cuerpo está debajo de tu cintura, eres una persona auténtica. :-) Quiero decir "articulación del dedo". Escribir demasiado sería malo para sus articulaciones. ;-)
fuente