我正在使用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"
中,我为每个测试分配了一些资源。最后,看一下各种单元测试创建的资源,我希望能够看到哪一个是通过哪个测试创建的。最好的办法就是在创建资源时使用测试名称。
答案 0 :(得分:58)
你也可以使用Request Fixture这样做:
def test_name1(request):
testname = request.node.name
assert testname == 'test_name1'
答案 1 :(得分:14)
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 ===========================
答案 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)