python - run - Ejecutando una prueba individual desde unittest.TestCase a través de la línea de comando
unittest python 3 (6)
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 estoy escribiendo un nuevo código de prueba y quiero ejecutarlo a menudo, y ahorrar tiempo, lo que hago es poner "__" al frente 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 bastante molesto.
Por ejemplo, cuando realice cambios en testItIsHot()
, quiero poder hacer esto:
$ python testMyCase.py testItIsHot
y tener unittest
run solo testItIsHot()
¿Cómo puedo lograr eso?
Traté de reescribir el if __name__ == "__main__":
parte, pero como soy nuevo en Python, me siento perdido y sigo atacando todo menos los métodos.
Aquí hay otra manera
testname = "testItIsHot"
testcase = MyCase(testname)
testcase.testItIsHot()
Esto funciona como usted sugiere, solo tiene que especificar el nombre de la clase también:
python testMyCase.py MyCase.testItIsHot
Inspirado por 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 requerir el uso de la línea de comando, o simplemente python3 my_test_file.py
desde la línea de comando con python3 my_test_file.py
.
import my_test_file
my_test_file.run_unit_tests()
Lamentablemente esto solo funciona para Python 3.3
o superior:
import unittest
class LineBalancingUnitTests(unittest.TestCase):
@classmethod
def setUp(self):
self.maxDiff = None
def test_it_is_sunny(self):
self.assertTrue("a" == "a")
def test_it_is_hot(self):
self.assertTrue("a" != "b")
def run_unit_tests():
runner = unittest.TextTestRunner()
classes = /
[
LineBalancingUnitTests,
]
# Comment all the tests names on this list, to run all Unit Tests
unit_tests_to_run = /
[
"test_it_is_sunny",
# "test_it_is_hot",
]
runner.run( suite( classes, unit_tests_to_run ) )
def suite(classes, unit_tests_to_run):
"""
Problem with sys.argv[1] when unittest module is in a script
https://.com/questions/2812218/problem-with-sys-argv1-when-unittest-module-is-in-a-script
Is there a way to loop through and execute all of the functions in a Python class?
https://.com/questions/2597827/is-there-a-way-to-loop-through-and-execute-all-of-the-functions
looping over all member variables of a class in python
https://.com/questions/1398022/looping-over-all-member-variables-of-a-class-in-python
"""
suite = unittest.TestSuite()
unit_tests_to_run_count = len( unit_tests_to_run )
for _class in classes:
_object = _class()
for function_name in dir( _object ):
if function_name.lower().startswith( "test" ):
if unit_tests_to_run_count > 0 /
and function_name not in unit_tests_to_run:
continue
suite.addTest( _class( function_name ) )
return suite
if __name__ == "__main__":
print( "/n/n" )
run_unit_tests()
Editando un poco el código, puede pasar una matriz con todas las pruebas unitarias que le gustaría llamar:
...
def run_unit_tests(unit_tests_to_run):
runner = unittest.TextTestRunner()
classes = /
[
LineBalancingUnitTests,
]
runner.run( suite( classes, unit_tests_to_run ) )
...
Y otro archivo:
import my_test_file
# Comment all the tests names on this list, to run all Unit Tests
unit_tests_to_run = /
[
"test_it_is_sunny",
# "test_it_is_hot",
]
my_test_file.run_unit_tests( unit_tests_to_run )
Puede funcionar bien, como adivinas
python testMyCase.py MyCase.testItIsHot
Y hay otra manera de probar testItIsHot
:
suite = unittest.TestSuite()
suite.addTest(MyCase("testItIsHot"))
runner = unittest.TextTestRunner()
runner.run(suite)
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:
python -m unittest mypkg.tests.test_module.TestClass.test_method
# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot
Si revisa 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 probar métodos de 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
No requiere que defina un unittest.main()
como el comportamiento predeterminado de su módulo.