usar unittest unitarias unidad test pruebas prueba ejecutar como casos python unit-testing python-nose

unittest - python pruebas



¿Cómo organizar la prueba de Python de manera que pueda ejecutar todas las pruebas en un solo comando? (5)

Este es probablemente un tema muy discutido, pero le sugiero que separe sus pruebas de sus módulos. Configura algo como esto ...

Utilice setup.py para instalarlos en la ruta del sistema (o puede modificar variables de entorno para evitar la necesidad de un paso de "instalación").

foo/ module1.py module2.py subpackage1/ __init__.py moduleA.py moduleB.py

Ahora cualquier script de python en cualquier lugar puede acceder a esos módulos, en lugar de depender de encontrarlos en el directorio local. Pon tus pruebas a un lado así:

tests/ test_module1.py test_module2.py test_subpackage1_moduleA,py test_subpackage2_moduleB.py

No estoy seguro acerca de su comando nosetests , pero ahora que sus pruebas están todas en el mismo directorio, es mucho más fácil escribir un script de envoltura que simplemente importe todas las otras pruebas en el mismo directorio. O si eso no es posible, al menos puede salirse con la suya con un simple loop bash que obtiene sus archivos de prueba uno por uno:

#!/bin/bash cd tests/ for TEST_SCRIPT in test_*.py ; do nosetests -m $TEST_SCRIPT done

Actualmente mi código está organizado en la siguiente estructura de árbol:

src/ module1.py module2.py test_module1.py test_module2.py subpackage1/ __init__.py moduleA.py moduleB.py test_moduleA.py test_moduleB.py

Donde el module*.py contiene el código fuente y el test_module*.py contiene el TestCase s para el módulo correspondiente.

Con los siguientes comandos puedo ejecutar las pruebas contenidas en un solo archivo, por ejemplo:

$ cd src $ nosetests test_filesystem.py .................. ---------------------------------------------------------------------- Ran 18 tests in 0.390s OK

¿Cómo puedo ejecutar todas las pruebas? Intenté con nosetests -m ''test_.*'' Pero no funciona.

$cd src $ nosetests -m ''test_.*'' ---------------------------------------------------------------------- Ran 0 tests in 0.000s OK

Gracias


Daré una respuesta de Testoob .

Ejecutar pruebas en un solo archivo es como Nariz:

testoob test_foo.py

Para ejecutar pruebas en muchos archivos, puede crear conjuntos con los recopiladores Testoob (en cada subpaquete)

# src/subpackage?/__init__.py def suite(): import testoob return testoob.collecting.collect_from_files("test_*.py")

y

# src/alltests.py test_modules = [ ''subpackage1.suite'', ''subpackage2.suite'', ] def suite(): import unittest return unittest.TestLoader().loadTestsFromNames(test_modules) if __name__ == "__main__": import testoob testoob.main(defaultTest="suite")

No he probado tu escenario específico.


Ya sea que separe o mezcle pruebas y módulos es probablemente una cuestión de gusto, aunque yo recomendaría encarecidamente mantenerlos separados (razones de configuración, estadísticas de códigos, etc.).

Cuando utilice nosetests, asegúrese de que todos los directorios con pruebas sean paquetes reales:

src/ module1.py module2.py subpackage1/ __init__.py moduleA.py moduleB.py tests/ __init__.py test_module1.py test_module2.py subpackage1/ __init__.py test_moduleA.py test_moduleB.py

De esta forma, puede ejecutar nosetests de nosetests en el directorio de nivel nosetests y se encontrarán todas las pruebas. Debe asegurarse de que src/ esté en PYTHONPATH , de lo contrario, todas las pruebas fallarán debido a la falta de importaciones.


No sé sobre pruebas en la nariz, pero puede lograr eso con el módulo de prueba unitario estándar. Solo necesita crear un archivo test_all.py debajo de su directorio raíz, luego importe todos sus módulos de prueba. En tu caso:

import unittest import test_module1 import test_module2 import subpackage1 if __name__ == "__main__": allsuites = unittest.TestSuite([test_module1.suite(), / test_module2.suite(), / subpackage1.test_moduleA.suite(), / subpackage1.test_moduleB.suite()])

cada módulo debe proporcionar la siguiente función (ejemplo con un módulo con dos pruebas unitarias: Class1 y Class1 ):

def suite(): """ This defines all the tests of a module""" suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(Class1)) suite.addTest(unittest.makeSuite(Class2)) return suite if __name__ == ''__main__'': unittest.TextTestRunner(verbosity=2).run(suite())


Si todos comienzan con la test entonces la test nosetest debería funcionar. Nose busca automáticamente cualquier archivo que comience con ''prueba''.