2011-03-19 10 views
12

Cómo ejecutar varias clases en Single Test Suite en Python Prueba de unidades .....Cómo ejecutar varias clases en Single Test Suite en Python ¿Pruebas unitarias?

+0

¿Quisiste decir esto? http://stackoverflow.com/questions/1732438/run-all-unit-test-in-python-directory – amdstorm

+0

¿Te refieres a esto? http://stackoverflow.com/questions/1732438/run-all-unit-test-in-python-directory Ejecuta múltiples clases de prueba de Python en un directorio – amdstorm

Respuesta

23

Si desea ejecutar todas las pruebas de una lista específica de las clases de prueba, en lugar de todas las pruebas de todas las clases de prueba en un módulo, se puede utilizar un loadTestsFromTestCase método TestLoader 's para obtener una TestSuite de pruebas para cada clase, y luego crear un único TestSuite que combina la lista de conjuntos de que se puede utilizar con run:

import unittest 

# Some tests 

class TestClassA(unittest.TestCase): 
    def testOne(self): 
     # test code 
     pass 

class TestClassB(unittest.TestCase): 
    def testOne(self): 
     # test code 
     pass 

class TestClassC(unittest.TestCase): 
    def testOne(self): 
     # test code 
     pass 

if __name__ == '__main__': 
    # Run only the tests in the specified classes 

    test_classes_to_run = [TestClassA, TestClassC] 

    loader = unittest.TestLoader() 

    suites_list = [] 
    for test_class in test_classes_to_run: 
     suite = loader.loadTestsFromTestCase(test_class) 
     suites_list.append(suite) 

    big_suite = unittest.TestSuite(suites_list) 

    runner = unittest.TextTestRunner() 
    results = runner.run(big_suite) 

    # ... 
0

He encontrado nose como una buena herramienta para esto. Descubre todas las pruebas unitarias en una estructura de directorio y las ejecuta.

+0

¿Puede publicar solución para este problema, por favor ... – passionTime

12

No estoy seguro de lo que está preguntando aquí, pero si quiere saber cómo probar varias clases en la misma suite, generalmente solo crea varias clases de prueba en el mismo archivo python y las ejecuta juntas:

import unittest 

class TestSomeClass(unittest.TestCase): 
    def testStuff(self): 
      # your testcode here 
      pass 

class TestSomeOtherClass(unittest.TestCase): 
    def testOtherStuff(self): 
      # testcode of second class here 
      pass 

if __name__ == '__main__': 
    unittest.main() 

y correr con por ejemplo:

python mytestsuite.py 

ejemplos más se pueden encontrar en the official documention.

Si, por otro lado, desea ejecutar varios archivos de prueba, como se detalla en "How to organize python test in a way that I can run all tests in a single command?", entonces la otra respuesta es probablemente mejor.

0

Normalmente se haría de la siguiente manera (que añade una sola clase por suite):

# Add tests. 
alltests = unittest.TestSuite() 
alltests.addTest(unittest.makeSuite(Test1)) 
alltests.addTest(unittest.makeSuite(Test2)) 

Si le gustaría tener múltiples clases por suite, que puede utilizar agregar estas pruebas de la siguiente manera:

for name in testnames: 
    suite.addTest(tc_class(name, cargs=args)) 

Aquí es mismo ejemplo para ejecutar todas las clases por suite independiente puede definir su propio método make_suite :

# Credits: http://codereview.stackexchange.com/a/88662/15346 
def make_suite(tc_class): 
    testloader = unittest.TestLoader() 
    testnames = testloader.getTestCaseNames(tc_class) 
    suite = unittest.TestSuite() 
    for name in testnames: 
     suite.addTest(tc_class(name, cargs=args)) 
    return suite 

# Add all tests. 
alltests = unittest.TestSuite() 
for name, obj in inspect.getmembers(sys.modules[__name__]): 
    if inspect.isclass(obj) and name.startswith("FooTest"): 
     alltests.addTest(make_suite(obj)) 

result = unittest.TextTestRunner(verbosity=2).run(alltests) 

Si arriba no está incluido, puede convertir el ejemplo anterior en un método que podría aceptar múltiples clases.

1

El método unittest.TestLoader.loadTestsFromModule() descubrirá y cargará todas las clases en el módulo especificado. Entonces puede hacer esto:

import unittest 
import sys 

class T1(unittest.TestCase): 
    def test_A(self): 
    pass 
    def test_B(self): 
    pass 

class T2(unittest.TestCase): 
    def test_A(self): 
    pass 
    def test_B(self): 
    pass 

if __name__ == "__main__": 
    suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__]) 
    unittest.TextTestRunner(verbosity=3).run(suite) 
Cuestiones relacionadas