2013-07-18 4 views
16

py.testを使用していて、各テストを実行する前に呼び出されたsetupメソッド内で現在実行されているテストの名前を取得できるかどうか、疑問に思っています。このコードを考えてみましょう:TestSomething.test_the_powerが実行になる前に、コードに概説されているようtest_name == "TestSomething.test_the_power"ようpy.test:現在のテストの名前をセットアップ方法から取得する方法は?

class TestSomething(object): 

    def setup(self): 
     test_name = ... 

    def teardown(self): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

右を、私はtest_name = ...経由setupに、この名前へのアクセス権を持っていると思います。

実際には、setupでは、テストごとにリソースを割り当てます。最後に、さまざまな単体テストによって作成されたリソースを見て、どちらがどのテストで作成されたのかを確認したいと思います。最良のことは、リソースの作成時にテスト名を使用することだけです。

答えて

8

setupteardown方法は、例えば、他のフレームワークのために書かれたテストをサポートするための従来の方法のように見えます鼻。ネイティブのpytestメソッドは、と同様に、現在実行されているテストメソッドを引数として受け取るteardown_methodと呼ばれます。そこで、私が達成したいので、同じように書くことができます。

class TestSomething(object): 

    def setup_method(self, method): 
     print "\n%s:%s" % (type(self).__name__, method.__name__) 

    def teardown_method(self, method): 
     pass 

    def test_the_power(self): 
     assert "foo" != "bar" 

    def test_something_else(self): 
     assert True 

py.test -sの出力は次のとおりです。

============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.3.3 
plugins: cov 
collected 2 items 

test_pytest.py 
TestSomething:test_the_power 
. 
TestSomething:test_something_else 
. 

=========================== 2 passed in 0.03 seconds =========================== 
0

おそらくtype(self).__name__を試してください。

+0

私の例では、これは 'TestSomething'のみを提供します。私は主に名前の2番目の部分の後です:) –

0

あなたは場合...

test_names = [n for n in dir(self) if n.startswith('test_')] 

複数のテストを、持っているかもしれませんが...あなたselfに「TEST_」で始まるすべての関数とインスタンス変数を提供します。 "test_something"という名前の変数がない限り、これは機能します。

setup(self)の代わりにsetup_method(self, method)メソッドを定義することもできます。これは、各テストメソッド呼び出しの前に呼び出されます。これを使うと、単純に各メソッドがパラメータとして与えられます。参照:http://pytest.org/latest/xunit_setup.html

+0

py.testテストを表すすべてのメソッドは 'test'で始まります。ここで必要なのは、py.test APIです。なぜなら、py.testはすべてのテストを事前に収集しており(基本的にここで示唆したように)、どのテストが今実行されているかを既に知っているからです。私はちょうどpy.testに質問する正しい質問を知らない:-) –

+0

あなたの編集後のコメント:私は単に "test_"で始まるすべてのメソッドのリストを持っていません。このリストから、私はテストの1つの名前/方法が実行された直後*です。そして、これはpy.test内部だけが伝えることができます。 –

+0

私はあなたが 'setup'の代わりに' setup_method'をしたいと思っています – ejk314

0

あなたはinspectモジュールを試して与えることができます。

輸入は

def foo(): 
    print "My name is: ", inspect.stack()[0][3] 


foo() 

出力を検査:私の名前は次のとおりです。FOO

+0

'setup'メソッドから呼び出されると、明らかに' setup'が返されます。 –

+0

これは私にとって非常に役に立ちました、ありがとう! – kroe761

35

また、このようなRequest Fixtureを使用してこれを行うことができます。

def test_name1(request): 
    testname = request.node.name 
    assert testname == 'test_name1' 
+6

**これは一般的な答えです。**テスト関数_and_ testメソッドの両方に等しく適用できます。 py.testのドキュメントは非常に壮観ですが、 'request'フィクスチャのドキュメントはひどくひどいです。 'request.node'属性は「基になるコレクションノード(現在の要求スコープに依存します)」としてのみ記述されています。それでおしまい。私は絶対にこれを見いだすことはできませんでした。そして、他の誰かがそれを持っているか疑問に思っています。ブラボー、ふかふかダニエル! –

+5

しかし、テスト関数がパラメータ化されている場合、 'request.node.name'はパラメータを持つ一意の名前を含みます。 'test_name [param-other_param]'です。したがって、元の関数名を提供する['request.node.originalname'](http://doc.pytest.org/en/latest/writing_plugins.html#_pytest.python.Function.originalname)を常に使用することは_safer_ですそのまま。 py.test 3.0から利用可能であることに注意してください。 – julen

関連する問題