16

コマンドライン引数を受け入れるノーズテストスクリプトを実行できるようにしたいと思います。たとえば、次のようなものがあります。

test.py

import nose, sys

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

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

ただし、コマンドライン引数を使用してこれを実行すると、エラーが発生します。

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

どうやら、noseはsys.argvで渡された引数を使って何かをしようとします。鼻にそれらの議論を無視させる方法はありますか?

4

5 に答える 5

18

わかりました、「なぜそれをしたいのですか?」は嫌いです。誰と同じように答えますが、ここで作成する必要があります。気にしないでください。

あなたがやりたいことを何でもすることは、フレームワークの鼻の範囲内ではないと私は主張します。ノーズは自動テスト用です。テストに合格するためにコマンドライン引数を渡す必要がある場合、それは自動化されていません。今、あなたができることは次のようなものです:

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

それを実行すると、次の出力が得られます。

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

OK

(stdout で何が行われるかを見たい場合は、-s フラグを渡すことを忘れないでください)

ただし、回避できる場合、自動テストでグローバル状態をいじるのは一般的に悪い考えであるため、おそらくそれには反対することをお勧めします。私が行う可能性が高いのは、リストを取得するためにテストしたいコードを適応させることですargvsys.argv次に、テスト中に必要なものを渡して、本番環境に渡すことができます。

更新

これを行う必要があるのは、同じライブラリの複数の実装をテストしているためです。これらの実装が正しいことをテストするために、テスト用にインポートする必要があるライブラリをコマンド ライン引数として受け入れる単一のノーズ スクリプトを使用します。

ノーズ プラグインを作成してみたいと思うかもしれません。やり方はとても簡単です。 ここに最新のドキュメントがあります。

于 2009-11-02T12:58:25.303 に答える
12

コードに何かを入れる別の方法を使用できます。

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)

次に、鼻を鳴らす前に環境を設定することを忘れないでください。

于 2013-04-30T00:26:25.140 に答える
7

それは完全に受け入れられるシナリオだと思います。また、さまざまなシナリオ (dev、qa、prod など) に対してテストを実行するために、同様のことを行う必要があり、各環境に適切な URL と構成が必要でした。

私が見つけた解決策は、nose-testconfigプラグイン (ここにリンク) を使用することでした。コマンドライン引数を正確に渡すのではなく、すべてのパラメーターを含む構成ファイルを作成し、鼻テストを実行するときにこの構成ファイルを引数として渡します。

構成ファイルの形式は次のとおりです。

[group1]
env=qa

[urlConfig]
address=http://something

[dbConfig]
user=test
pass=test

そして、次を使用して引数を読み取ることができます。

from testconfig import config

print(config['dbConfig']['user'])
于 2015-04-01T08:44:08.633 に答える
3

今のところ、次のハックを使用しています。

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

これは引数をローカル変数に読み込み、追加の引数をすべて削除してsys.argv、nose が混乱しないようにします。

于 2009-11-11T22:09:39.010 に答える
2

鼻を実行してパラメーターを渡すだけでは機能しません。鼻は引数を鼻パラメーターとして解釈しようとするため、表示されている問題が発生します。

私はまだ鼻サポートパラメーターが直接渡されるとは思わない.

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
于 2009-11-02T12:39:39.440 に答える