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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top