Pregunta

Me gustaría ser capaz de ejecutar una nariz de prueba de secuencia de comandos que acepta argumentos de línea de comandos.Por ejemplo, a lo largo de las líneas:

test.py

import nose, sys

def test():
    # do something with the command line arguments
    print sys.argv

if __name__ == '__main__':
    nose.runmodule()

Sin embargo, cada vez que ejecuto esto con un argumento de línea de comandos, me sale un error:

$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
    module = resolve_name(addr.module)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
    module = __import__('.'.join(parts_copy))
ImportError: No module named arg

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

Al parecer, la nariz, trata de hacer algo con los argumentos pasados en sys.argv.Es allí una manera de hacer que la nariz ignorar esos argumentos?

¿Fue útil?

Solución

Bien, me odio "¿por qué quieres hacer eso?" las respuestas tanto como a nadie, pero voy a tener que hacer uno aquí.Espero que no te importa.

Yo diría que al hacer lo que estás queriendo hacer no está dentro del ámbito de aplicación del marco de la nariz.La nariz está diseñado para automatizado pruebas.Si tiene que pasar en argumentos de línea de comandos para que la prueba pase, entonces no está automatizado.Ahora, lo que puede hacer es algo como esto:

import sys

class test_something(object):
    def setUp(self):
        sys.argv[1] = 'arg'
        del sys.argv[2] # remember that -s is in sys.argv[2], see below
    def test_method(self):
        print sys.argv

Si se ejecuta este, se obtiene la siguiente salida:

[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

(Recuerde pasar en la -s de la bandera si quieres ver lo que pasa en stdout)

Sin embargo, yo probablemente todavía recomendamos que, como es generalmente una mala idea meterse con el estado global en las pruebas automatizadas si se puede evitar.Lo que es probable que hacer es adaptar cualquier código que estoy con ganas de probar a tomar un argv lista.A continuación, puede pasar lo que quieras durante la prueba y pase sys.argv en la producción.

ACTUALIZACIÓN:

La razón por la que necesitamos hacer es porque yo estoy probando varias implementaciones de la misma biblioteca.Para la comprobación de las implementaciones correcto uso una sola nariz script, que acepta como una línea de comandos argumento de la biblioteca que se debe de importación para las pruebas.

Suena como que usted puede intentar su mano en escribir una nariz plugin.Es bastante fácil de hacer. Aquí están las últimas docs.

Otros consejos

Usted podría utilizar otro medio para obtener cosas en su código:

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)

A continuación, sólo recuerde para configurar su entorno antes de ejecutar la nariz.

Creo que es perfectamente aceptable escenario.Yo también necesitaba hacer algo similar con el fin de ejecutar las pruebas en contra de los diferentes escenarios (dev, control de calidad, prod, etc) y no necesitaba el derecho de las direcciones URL y las configuraciones para cada entorno.

La solución que encontré fue el uso de la nariz-testconfig plugin (enlace aquí).No es exactamente que pasa argumentos de línea de comandos, pero la creación de un archivo de configuración con todos sus parámetros y, a continuación, pasar este archivo de configuración como argumento al ejecutar su nariz-pruebas.

El archivo de configuración tiene el siguiente formato:

[group1]
env=qa

[urlConfig]
address=http://something

[dbConfig]
user=test
pass=test

Y usted puede leer los argumentos usando:

from testconfig import config

print(config['dbConfig']['user'])

Por ahora estoy utilizando el siguiente hack:

args = sys.argv[1:]
sys.argv = sys.argv[0:1]

que sólo lee el argumento en una variable local, y, a continuación, elimina todos los argumentos adicionales en sys.argv de modo que la nariz no confundirse con ellos.

Simplemente ejecutar la nariz y pasando parámetros no va a funcionar como la nariz se intenta interpretar los argumentos de la nariz de los parámetros de manera que usted obtenga los problemas que están viendo.

No creo que la nariz de apoyo a la transferencia de parámetros directamente, pero esta nariz plug-in nariz-testconfig Permite pruebas de escritura, como el de abajo:

from testconfig import config
def test_os_specific_code():
    os_name = config['os']['type']
    if os_name == 'nt':
        pass # some nt specific tests
    else:
        pass # tests for any other os
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top