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''.