21

私がやろうとしていることはかなり単純だと思います。テストセットアップ関数でいくつかの変数を初期化し、そのセットアップで装飾されたテスト関数でそれらを使用したいと思います。次の簡単な例は、私が何を意味するかを示しています。

from nose.tools import *

def setup():
    foo = 10

def teardown():
    foo = None

@with_setup(setup, teardown)
def test_foo_value():
    assert_equal(foo, 10)

これにより、次のようになります。

$ nosetests tests/test_foo.py
E
======================================================================
ERROR: test_foo.test_foo_value
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/mtozzi/.virtualenvs/foo/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
  File "/home/mtozzi/code/foo/tests/test_foo.py", line 12, in test_foo_value
assert_equal(foo, 10)
NameError: global name 'foo' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.006s

FAILED (errors=1)

古い単体テストスタイルでは、これらをテストクラスのインスタンス変数として設定できましたが、nosetestsではクラスを使用する必要はないと思いました。それらをパッケージグローバル変数として設定することも検討しましたが、それはひどく良い習慣ではないようです。これを行うために私が見逃している明らかな何かがあることを願っています。

4

2 に答える 2

13

あなたの質問へのコメントがすでに示唆しているように、単にクラスに切り替えて、のようなインスタンス変数を使用してくださいself.foo。それはそれが行われるべき方法です。

クラスを使用しないと主張する場合は、global変数を試してください。しかし、あなたは私からこれを聞いていません。

from nose.tools import *

foo = None

def setup():
    global foo  # Ugly.
    foo = 10

def teardown():
    global foo  # Ugly.
    foo = None

@with_setup(setup, teardown)
def test_foo_value():
    assert_equal(foo, 10)

3 番目の方法は、値に辞書を使用することです。これは少し醜いものではありませんが、恐ろしく不器用です:

from nose.tools import *

_globals = {'foo': None}

def setup():
    _globals['foo'] = 10

def teardown():
    _globals['foo'] = None

@with_setup(setup, teardown)
def test_foo_value():
    foo = _globals['foo']
    assert_equal(foo, 10)
于 2012-05-13T17:27:37.923 に答える
2

貧乏人の非ローカルを使用するカスタム with_setup デコレーターを使用します: https://gist.github.com/garyvdm/392ae20c673c7ee58d76

def setup():
    foo = 10
    return [foo], {}

def teardown(foo):
    pass

@with_setup_args(setup, teardown)
def test_foo_value(foo):
    nose.tools.assert_equal(foo, 10)

Python 3 のみのプロジェクトでは、引数 kwargs に .extend/.update ではなく非ローカルを使用します。

于 2014-05-12T19:27:43.010 に答える