2011-12-13 8 views
5

Tengo varios módulos de prueba que se invocan todos juntos a través de un script del controlador que puede tomar una variedad de argumentos. Las pruebas en sí están escritas usando el módulo python unittest.Pasar los argumentos del script de python a los módulos de prueba

import optparse 
import unittest 
import sys 
import os 

from tests import testvalidator 
from tests import testmodifier 
from tests import testimporter 

#modify the path so that the test modules under /tests have access to the project root 
sys.path.insert(0, os.path.dirname(__file__)) 

def run(verbosity): 
    if verbosity == "0": 
      sys.stdout = open(os.devnull, 'w') 

    test_suite = unittest.TestSuite() 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testvalidator.TestValidator)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testmodifier.TestModifier)) 
    test_suite.addTest(unittest.TestLoader().loadTestsFromTestCase(testimporter.TestDataImporter)) 

    unittest.TextTestRunner(verbosity=int(verbosity)).run(test_suite) 

if __name__ == "__main__": 

    #a simple way to control output verbosity 
    parser = optparse.OptionParser() 
    parser.add_option("--verbosity", "--verbosity", dest="verbosity", default="0") 
    (options, args) = parser.parse_args() 

    run(options.verbosity) 

Mi problema es que, dentro de estos módulos de prueba, tengo ciertas pruebas que me gustaría saltar en base a diferentes parámetros pasados ​​al controlador. Soy consciente de que unittest proporciona una familia de decoradores con la intención de hacer esto, pero no sé cuál es la mejor manera de pasar esta información a los módulos individuales. Si tuviera un argumento --skip-slow, por ejemplo, ¿cómo podría anotar las pruebas como lento y hacer que se salten?

Gracias por su tiempo.

+0

Es posible que haya encontrado una solución que pueda usar. Verifica mi respuesta. –

Respuesta

2

De hecho, me lo estaba preguntando y finalmente encontré la solución.

archivo principal ...

... 
if __name__ == '__main__': 
    args = argparser() 

    from tests import * 

    ... 

Y en sus módulos de prueba, simplemente:

from __main__ import args 

print args 

He probado esto a cabo, y funcionó bastante bien. Lo bueno es lo simple que es, y no es demasiado pirateo.

1

Puede utilizar nose test runner con el complemento attrib que le permite seleccionar casos de prueba según los atributos. En particular, el ejemplo en la documentación del complemento usa @attr(slow) para marcar los casos de prueba lentos.

Después de eso, desde la línea de comandos:

  • Para seleccionar todos los casos de prueba marcado como slow:

    $ nosetests -a slow

  • Para seleccionar todos los casos de prueba no marcadas como slow:

    $ nosetests -a '!slow'

+0

Probablemente necesito familiarizarme con la nariz, ya que parece que Unittest puede no estar a la altura. Esperaba no tener que agregar una dependencia. – zchtodd

+1

Puedes crear tu propio decorador 'attr' basado en' unittest.skipIf'/'unittest.skipUnless' y alguna variable de entorno que se use en la condición que verifican los decoradores de omisiones, pero no diría que vale la pena el esfuerzo cuando tienes algo que ya funciona de la caja. – jcollado

Cuestiones relacionadas