Ответ 1
Вы также можете сделать это с помощью Fixture Request:
def test_name1(request):
testname = request.node.name
assert testname == 'test_name1'
Я использую 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
== "TestSomething.test_the_power"
.
Собственно, в setup
я выделяю некоторый ресурс для каждого теста. В конце концов, глядя на ресурсы, которые были созданы различными модульными тестами, я хотел бы узнать, какой из них был создан с помощью теста. Лучше всего было бы просто использовать имя теста при создании ресурса.
Вы также можете сделать это с помощью Fixture Request:
def test_name1(request):
testname = request.node.name
assert testname == 'test_name1'
Методы 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 ===========================
Вы также можете использовать PYTEST_CURRENT_TEST
окружения PYTEST_CURRENT_TEST
установленную pytest для каждого теста.
Переменная окружения PYTEST_CURRENT_TEST
Чтобы получить только название теста:
os.environ.get('PYTEST_CURRENT_TEST').split(':')[-1].split(' ')[0]
У вас может быть несколько тестов, и в этом случае...
test_names = [n for n in dir(self) if n.startswith('test_')]
... предоставит вам все функции и переменные экземпляра, которые начинаются с "test_" в self
. Пока у вас нет переменных с именем "test_something", это будет работать.
Вы также можете определить метод setup_method(self, method)
вместо setup(self)
и который будет вызываться перед каждым вызовом метода тестирования. Используя это, вам просто присваивается каждый метод в качестве параметра. См.: http://pytest.org/latest/xunit_setup.html
Попробуйте type(self).__name__
возможно?
Вы можете дать модуль проверки, попробуйте.
import inspect
def foo():
print "My name is: ", inspect.stack()[0][3]
foo()
Вывод: My name is: foo