2011-05-10 18 views
6

Estoy intentando proporcionar argumentos de línea de comando a Python unittest y enfrentar algunos problemas. He buscado en internet y encontró una manera de suministrar argumentos como¿Cómo probar los argumentos de la línea de comando?

unittest.main(argv=[myArg]) 

El problema es que esto funciona muy bien para el argumento sola línea de comandos, pero no por más de dos argumentos.

unittest.main(argv=[myArg1, myArg2, myArg3]) 

Por encima de llamada falla con el error a continuación:

File "/opt/python2.6.6/lib/python2.6/unittest.py", line 816, in __init__ 
    self.parseArgs(argv) 
    File "/opt/python2.6.6/lib/python2.6/unittest.py", line 843, in parseArgs 
    self.createTests() 
    File "/opt/python2.6.6/lib/python2.6/unittest.py", line 849, in createTests 
    self.module) 
    File "/opt/python2.6.6/lib/python2.6/unittest.py", line 613, in 
    loadTestsFromNames suites = [self.loadTestsFromName(name, module) 
    for name in names] 
    File "/opt/python2.6.6/lib/python2.6/unittest.py", line 584, in 
    loadTestsFromName parent, obj = obj, getattr(obj, part) 
AttributeError: 'module' object has no attribute 'admin' 

hicieron pozos más en esto y encontraron que Python unittest trata todo lo envía utilizando argv como caso de prueba para ser ejecutado.

Háganme saber Si todavía hay una manera de suministrar más de una argumentación a mis casos de prueba unitaria. Quiero anular algunos valores codificados como la dirección IP, la etiqueta del caso de prueba, etc. y básicamente ejecutar este script de prueba desde el script de prueba principal.

Gracias de antemano.

Respuesta

10

¿Por qué no sacar los argumentos de línea de comandos antes de ejecutar unittest.main, y luego darle [sys.argv[0]] para su argv?

Algo así como:

if __name__ == '__main__': 
    # do stuff with sys.argv 
    unittest.main(argv=[sys.argv[0]]) 

Tenga en cuenta que cuando se le da argv=None, unittest.main realmente toma esto como una señal para analizar sys.argv. unittest.main requiere al menos un elemento argv para usar como nombre del programa. Así que evitar None, [sys.argv[0]] es un buen valor para dar, ya que cree que no tiene argumentos de línea de comandos.


P.S. Solo noté tu última oración. Si ese es el caso, no use argumentos de línea de comandos. Su script de prueba "principal" solo debe usar las API de unittest en cargar casos de prueba para el módulo, personalizándolos a su gusto.

3

En lugar de enviar un comando desde la línea de comandos, suponga que OptionParser hará su trabajo y sembrará las variables con la entrada. Si usted tiene algo así como:

from optparse import OptionParser 
parser = OptionParser() 
parser.add_option("-t", "--tag", dest="tag", help="tag id") 

A continuación, intente sembrar tag con los valores como si hubieran llegado desde la línea de comandos, y luego pasar estos en sus clases de prueba __init__.

1

Tengo deseos similares, ya que necesitaba una forma de configurar los argumentos falsos de la línea de comandos para una prueba.

Encontré que reemplazar sys.argv dentro de cada prueba que lo necesitaba me funcionó. El argumento de función de unittest.main() que usted describe se usa para la prueba de unidad en sí, no para el módulo que desea probar.

Cuestiones relacionadas