Nose Testskript mit Befehlszeilenargumente
-
11-09-2019 - |
Frage
Ich möchte in der Lage sein, eine Nase Testskript auszuführen, die Befehlszeilenargumente akzeptiert. Zum Beispiel etwas entlang der Linien:
test.py
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
Jedes Mal, wenn ich dies mit einem Befehlszeilenargument laufen lasse, erhalte ich eine Fehlermeldung:
$ 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)
Offenbar Nase versucht, etwas mit den Argumenten in sys.argv weitergegeben zu tun. Gibt es eine Möglichkeit Nase zu machen, diese Argumente ignorieren?
Lösung
In Ordnung, ich hasse „Warum würden Sie das tun wollen?“ nur so viele Antworten, wie jemand, aber ich bin zu haben, eine hier zu machen. Ich hoffe, dass Sie nichts dagegen haben.
Ich würde behaupten, dass das, was tun Sie wollen im Rahmen der Rahmen Nase zu tun ist, nicht. Nase ist für automatische Tests bestimmt. Wenn Sie in Befehlszeilenargumente zu übergeben haben für den Test zu bestehen, dann ist es nicht automatisiert. Nun, was Sie können tun, ist so etwas wie folgt aus:
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
Wenn Sie ausführen, dass Sie diese Ausgabe erhalten:
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(Denken Sie daran, in dem Flag es passieren, wenn Sie sehen wollen, was auf stdout geht)
Allerdings würde ich wahrscheinlich empfehle nach wie vor dagegen, wie es zu Chaos mit globalem Zustand in automatisierten Tests im Allgemeinen eine schlechte Idee ist, wenn Sie es vermeiden können. Was würde ich wahrscheinlich tun ist, anzupassen, was Code, den ich wollte testen eine argv
Liste zu nehmen. Dann können Sie passieren in was auch immer Sie während des Tests wollen und in sys.argv
in der Produktion übergeben.
UPDATE :
Der Grund, warum ich tun muss, ist es weil ich Testen mehrerer Implementierungen derselben Bibliothek. Um zu testen, diese Implementierungen sind korrigiere ich eine einzelne Nase Skript verwenden, dass übernimmt als Befehlszeilen Argument der Bibliothek, die es sein sollte Import für den Test.
Es klingt wie Sie Ihre Hand versuchen, das Schreiben einer Nase Plugin möchten. Es ist ziemlich einfach zu tun. Dies sind die neuesten Dokumente.
Andere Tipps
Sie können ein anderes Mittel verwenden Sachen in Ihren Code bekommen:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Dann denken Sie daran, Ihre Umgebung zu setzen, bevor die Nase läuft.
Ich denke, dass ein durchaus akzeptabel Szenario. Ich brauche auch etwas ähnliches zu tun, um die Tests gegen verschiedene Szenarien (dev, qa, prod, usw.) zu laufen und dort brauchte ich die richtigen URLS und Konfigurationen für jede Umgebung.
Die Lösung fand ich war die nasen testconfig Plugin zu verwenden ( Link hier ). Es ist nicht genau vorbei Befehlszeilenargumente, aber eine Konfigurationsdatei mit allen Parametern zu schaffen, und dann vorbei diese Konfigurationsdatei als Argument, wenn Sie Ihre Nase-Tests durchführen.
Die Konfigurationsdatei hat folgendes Format:
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
Und Sie können die Argumente gelesen werden:
from testconfig import config
print(config['dbConfig']['user'])
Für jetzt habe ich den folgenden Hack bin mit:
args = sys.argv[1:]
sys.argv = sys.argv[0:1]
, die nur das Argument in eine lokale Variable liest und löscht dann alle zusätzlichen Argumente in sys.argv
so dass die Nase nicht von ihnen verwirrt bekommt.
Just Nase läuft und in Parameter übergeben werden nicht als Nase Arbeit versucht, die Argumente als Nase Parameter zu interpretieren, so dass Sie die Probleme bekommen Sie sehen.
Ich glaube nicht, Nase Unterstützung Parameter direkt noch vorbei, aber diese Nase Plug-in Nase- testconfig Hier können Sie Tests schreiben wie unter:
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