2009-12-03 15 views
25

Tengo un script que actúa como un contenedor para algunas pruebas de unidad escritas utilizando el módulo Python unittest. Además de la limpieza de algunos archivos, creando un flujo de salida y la generación de un código, se carga casos de prueba en una suite usandoPython, prueba de unidad: Pase los argumentos de línea de comando a setUp de unittest.TestCase

unittest.TestLoader().loadTestsFromTestCase() 

ya estoy usando optparse de sacar varios argumentos de línea de comandos utilizados para determinar la salida ubicación, ya sea para regenerar el código y si se debe hacer una limpieza. También deseo pasar una variable de configuración, a saber, un URI de punto final, para usar en los casos de prueba.

Me doy cuenta de que puedo agregar un OptionParser al método setUp de TestCase, pero quiero pasar la opción a setUp en su lugar. ¿Es esto posible usando loadTestsFromTestCase()? Puedo repetir el TestSuite devuelto TestCases, pero ¿puedo llamar manualmente a setUp en el TestCases?

** ** EDITAR quería señalar que yo soy capaz de pasar los argumentos a setUp si iterar sobre las pruebas y llamar a setUp manualmente como:

(options, args) = op.parse_args() 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions) 
for test in suite: 
    test.setUp(options.soap_uri) 

Sin embargo, estoy usando xmlrunner para esto y su método de ejecución toma un TestSuite como argumento. Supongo que ejecutará el método setUp en sí, así que necesitaría los parámetros disponibles dentro del XMLTestRunner.

Espero que esto tenga sentido.

Respuesta

43

Bueno, quiero hacer lo mismo e iba a hacer esta pregunta yo mismo. Quería mejorar el siguiente código porque tiene duplicación. No deje que me envían en argumentos para probar TestCase sin embargo:

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.hs = helpspot.HelpSpot(path, user, pword) 

    def test_version(self): 
     a = self.hs.version() 
     b = self.hs.private_version() 
     self.assertEqual(a, b) 

    def test_get_with_param(self): 
     a = self.hs.filter_get(xFilter=1) 

    def test_unknown_method(self): 
     self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple) 

if __name__ == '__main__': 
    import sys 
    user = sys.argv[1] 
    pword = sys.argv[2] 
    path = sys.argv[3] 

    test_loader = unittest.TestLoader() 
    test_names = test_loader.getTestCaseNames(TestHelpSpot) 

    suite = unittest.TestSuite() 
    for test_name in test_names: 
     suite.addTest(TestHelpSpot(test_name, path, user, pword)) 

    result = unittest.TextTestRunner().run(suite) 
    sys.exit(not result.wasSuccessful()) 
+0

¿Qué es helppot aquí? – SIslam

+0

HelpSpot es una aplicación de servicio al cliente de UserScape. Escribí una interfaz de Python para su API - https://github.com/JohnSpeno/python-helpspot – jps

+0

Para que esto funcione de forma similar a 'unittest.main()' debe agregar 'sys.exit (no result.wasSuccessful()) 'hasta el final. – abergmeier

5

Definitivamente desaconsejo pasar argumentos para configurar de esta manera; setUp está destinado a ser llamado implícitamente cuando se ejecuta una prueba, por lo que no debería llamarlo explícitamente así.

Una forma de abordar esto sería establecer los valores que necesita establecer como variables de entorno o valores en un módulo de "contexto" accesible globalmente, lo que permitiría a los casos de prueba acceder a ellos según sea necesario. Me gustaría utilizar variables de entorno, ya que es más flexible en términos de ejecutar las pruebas (ya no depende de los argumentos de la línea de comandos).

+4

Y luego otro código se basa en una variable ambiental con el mismo nombre, excelente. – GNUnit

0

Si define los atributos en el método init, entonces puede simplemente pasar a todos en el constructor como esto ..

import unittest 
import helpspot 

class TestHelpSpot(unittest.TestCase): 
    "A few simple tests for HelpSpot" 

    def __init__(self, testname, path, user, pword): 
     super(TestHelpSpot, self).__init__(testname) 
     self.path = path 
     self.user = user 
     self.pword = pword 
.... 
.... 
.... 


if __name__ == '__main__': 
    True 

    suite = unittest.TestSuite() 
    suite.addTest(TestHelpSpot("test_version", path, user, pword))  

    unittest.TextTestRunner().run(suite) 
7
if __name__ == '__main__': 
    from optparse import OptionParser 
    parser = OptionParser() 
    parser.add_option("-z", "--zebra", 
         action="store_true", dest="zebra", default=False, 
         help="run like a zebra")  


    (options, args) = parser.parse_args() 

    if options.zebra: 
     zebrafy() 


    # remove our args because we don't want to send them to unittest 
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]): 
     if x in sys.argv: 
      sys.argv.remove(x) 


    unittest.main() 
+0

Muy agradable. Exactamente lo que estaba buscando. –

+1

II quería agregar la opción '-i', y usé el código de arriba ... Comienzo mi prueba a través de' .. \ .. \ python \ python -m unittest -v "test_activation.test_activation" -i "input_file" ' . ¿Por qué me da un error 'test_activation.py: error: no existe esa opción: -m'? – Danijel

+0

Esto no funcionó para mí.Sin embargo, la siguiente línea para eliminar args funcionó. del sys.argv [1:] – Indrajeet

Cuestiones relacionadas