unittest unit test run examples example español assertraises assertequal python unit-testing

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.