2008-12-14 8 views
14

Actualmente mi código está organizado de la siguiente estructura:¿Cómo organizar la prueba de Python de forma que pueda ejecutar todas las pruebas en un solo comando?

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

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

Con las siguientes comands 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

Respuesta

7

Si todos ellos comienzan con test a continuación, sólo nosetest debe trabajo. Nose busca automáticamente cualquier archivo que comience con 'prueba'.

+2

Encontré el problema, nosetests omite porque son ejecutables. He solucionado el restablecimiento del bit de permiso ejecutable y la eliminación de la propiedad svn: executable de la propiedad de subversión. –

+2

La opción [--exe] (http://packages.python.org/nose/usage.html#cmdoption--exe) evitará que las pruebas en la nariz omitan archivos ejecutables. –

+0

Probablemente valga la pena considerar el movimiento a 'nose2' en lugar de' nosetest'. https://nose2.readthedocs.io/en/latest/getting_started.html – pds

2

Esto es probablemente un tema muy disputado, pero sugeriría que separe sus pruebas a partir de sus módulos. Configure 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 las pruebas de todo a un lado como esto:

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 todos en el mismo directorio, se hace mucho más fácil escribir un guión envoltorio que simplemente importa todas las otras pruebas en el mismo directorio. O si eso no es posible, al menos puede salirse con un simple bash bucle que recibe los archivos de prueba uno por uno:

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

Sugeriría que se refleje la estructura del paquete del programa en el directorio de prueba. De lo contrario, el directorio de prueba se convertirá en un desastre cuando el programa crezca. – deamon

0

Voy a dar una respuesta Testoob.

la realización de pruebas en un solo archivo es como Nariz:

testoob test_foo.py 

para ejecutar pruebas en muchos archivos puede crear suites con los colectores Testoob (en cada sub-paquete)

# 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 intentado su caso específico.

11

Si separa o mezcla 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.).

Al utilizar nosetests, asegúrese de que todos los directorios con pruebas reales son paquetes:

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 manera, sólo puede ejecutar nosetests en el directorio principal y se le encuentran todos los exámenes.Debe asegurarse de que src/ está en el PYTHONPATH, de lo contrario, todas las pruebas fallarán debido a la falta de importaciones.

4

No sé sobre nosetests, pero puede lograrlo con el módulo unittest 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 su 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 de unidad: Class1 y Class2):

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()) 
+0

Esto es lo que estaba buscando, excepto que creo que debería omitir el '()' después de cada nombre de suite (al menos en Python 2.6.5). –

+0

Python 2.7 tiene una forma de buscar automáticamente módulos/paquetes de prueba, lo que parece más fácil de mantener que recordar agregarlos explícitamente a un test_all.py. Ver http://docs.python.org/library/unittest.html#test-discovery –

Cuestiones relacionadas