Question

Je voudrais être en mesure d'exécuter un script de test de nez qui accepte les arguments de ligne de commande. Par exemple, quelque chose le long des lignes:

test.py

import nose, sys

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

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

Cependant, chaque fois que je lance ce avec un argument de ligne de commande, je reçois une erreur:

$ 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)

Apparemment, le nez essaie de faire quelque chose avec les arguments transmis sys.argv. Y at-il un moyen de faire le nez ignorer ces arguments?

Était-ce utile?

La solution

D'accord, je déteste « pourquoi voudriez-vous faire cela? » réponses tout autant que tout le monde, mais je vais devoir faire un ici. J'espère que vous ne me dérange pas.

Je dirais que faire ce que vous êtes désireux de faire est pas dans le cadre du nez-cadre. Le nez est destiné à automatisés tests. Si vous devez passer des arguments de ligne de commande pour le test à passer, il n'est pas automatisé. Maintenant, ce que vous peut faire est quelque chose comme ceci:

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 vous exécutez, vous obtenez cette sortie:

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

OK

(Rappelez-vous de passer dans le drapeau -s si vous voulez voir ce qui se passe sur la sortie standard)

Cependant, je vous recommande sans doute encore contre cela, comme il est généralement une mauvaise idée de jouer avec l'état global dans les tests automatisés si vous pouvez l'éviter. Ce que je probablement faire est tout adapter le code que je suis désireux de tester de prendre une liste de argv. Ensuite, vous pouvez passer dans tout ce que vous voulez pendant les essais et passer sys.argv dans la production.

UPDATE :

  

La raison pour laquelle je dois le faire est   parce que je teste plusieurs   les mises en œuvre de la même bibliothèque.   Pour tester ces mises en œuvre sont   J'utilise un corriger seul script de nez,   qui accepte en tant que ligne de commande   l'argument de la bibliothèque qu'il devrait   importer pour les tests.

On dirait que vous pouvez essayer à l'écriture d'un plugin nez. Il est assez facile à faire. Voici les derniers documents.

Autres conseils

Vous pouvez utiliser un autre moyen de faire des choses dans votre code:

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)

Alors souvenez-vous de définir votre environnement avant le nez en cours d'exécution.

Je pense que c'est un scénario tout à fait acceptable. J'ai aussi besoin de faire quelque chose de similaire pour exécuter les tests sur différents scénarios (dev, qa, prod, etc.) et là je avais besoin les bons URLS et configurations pour chaque environnement.

La solution que j'ai trouvé était d'utiliser le nez testconfig plug-in ( lien ). Il ne passe pas exactement les arguments de ligne de commande, mais la création d'un fichier de configuration avec tous vos paramètres, et en faisant passer ce fichier de configuration comme argument lorsque vous exécutez vos nez-tests.

Le fichier de configuration a le format suivant:

[group1]
env=qa

[urlConfig]
address=http://something

[dbConfig]
user=test
pass=test

Et vous pouvez lire les arguments en utilisant:

from testconfig import config

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

Pour l'instant je suis en utilisant le hack suivant:

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

qui se lit tout l'argument dans une variable locale, et supprime alors tous les arguments supplémentaires dans sys.argv de sorte que le nez ne soit pas confondu par eux.

Juste nez en cours d'exécution et le passage des paramètres ne fonctionnera pas comme le nez tentera d'interpréter les arguments comme paramètres du nez afin que vous obteniez les problèmes que vous voyez.

Je ne pense pas que le paramètre de soutien du nez qui passe directement encore, mais ce plug-in nez NOSE testconfig Permet d'écrire des tests comme ci-dessous:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top