py.test:如何从安装方法中获取当前测试的名称?

时间:2013-07-18 14:55:48

标签: python pytest

我正在使用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之前,我希望通过setup按照代码中的说明test_name = ...访问此名称,以便test_name == {{ 1}}。

实际上,在"TestSomething.test_the_power"中,我为每个测试分配了一些资源。最后,看一下各种单元测试创​​建的资源,我希望能够看到哪一个是通过哪个测试创建的。最好的办法就是在创建资源时使用测试名称。

8 个答案:

答案 0 :(得分:58)

你也可以使用Request Fixture这样做:

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

答案 1 :(得分:14)

setupteardown方法似乎是支持为其他框架编写的测试的传统方法,例如:鼻子。原生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 ===========================

答案 2 :(得分:9)

您还可以为每个测试用例使用pytest设置的PYTEST_CURRENT_TEST环境变量。

PYTEST_CURRENT_TEST environment variable

仅获取测试名称:

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

答案 3 :(得分:1)

您可能有多个测试,在这种情况下......

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

答案 4 :(得分:0)

或许试试type(self).__name__

答案 5 :(得分:0)

您可以尝试给检查模块。

import inspect

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


foo()

输出:My name is: foo

答案 6 :(得分:0)

尝试我的小包装函数,该函数返回测试的全名,文件和测试名称。以后可以使用任何您喜欢的东西。 我在conftest.py中使用了它,据我所知灯具无法正常工作。

def get_current_test():
    full_name = os.environ.get('PYTEST_CURRENT_TEST').split(' ')[0]
    test_file = full_name.split("::")[0].split('/')[-1].split('.py')[0]
    test_name = full_name.split("::")[1]

    return full_name, test_file, test_name

答案 7 :(得分:0)

# content of conftest.py

@pytest.fixture(scope='function', autouse=True)
def test_log(request):
    # Here logging is used, you can use whatever you want to use for logs
    log.info("STARTED Test '{}'".format(request.node.name))  

    def fin():
        log.info("COMPLETED Test '{}' \n".format(request.node.name))

    request.addfinalizer(fin)