web-dev-qa-db-ja.com

py.test:現在のテストの名前をセットアップメソッドから取得する方法?

私はpy.testを使用していて、各テストを実行する前に呼び出されるsetupメソッド内で現在実行されているテストの名前を取得することができるかどうか、またはどのように可能か疑問に思っています。このコードを考えてみましょう:

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

TestSomething.test_the_powerが実行される直前に、test_name = ... == test_nameとなるように、"TestSomething.test_the_power"を介してコードで概説されているように、setupでこの名前にアクセスしたいと思います。

実際、setupでは、テストごとにリソースを割り当てています。結局、さまざまな単体テストで作成されたリソースを見て、どのテストでどのリソースが作成されたかを確認したいと思います。最善の方法は、リソースの作成時にテスト名を使用することです。

次のように Request Fixture を使用してこれを行うこともできます。

def test_name1(request):
    testname = request.node.name
    assert testname == 'test_name1'
62
danielfrg

setupおよびteardownメソッドは、他のフレームワーク用に記述されたテストをサポートするためのレガシーメソッドのようです。鼻。ネイティブのpytestメソッドはsetup_methodおよび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 ===========================
14

各テストケースに対してpytestによって設定されたPYTEST_CURRENT_TEST環境変数を使用することもできます。

PYTEST_CURRENT_TEST環境変数

テスト名のみを取得するには:

os.environ.get('PYTEST_CURRENT_TEST').split(':')[-1].split(' ')[0]
9
Joao Coelho

複数のテストがある場合、その場合...

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

...selfの「test_」で始まるすべての関数とインスタンス変数が表示されます。 「test_something」という名前の変数がない限り、これは機能します。

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

1
ejk314

type(self).__name__を試してみませんか?

0
kindall

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

import inspect

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


foo()

出力:My name is: foo

0
Robert Caspary