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 я хотел бы получить доступ к этому имени в setup, как указано в коде через test_name = ..., чтобы test_name == "TestSomething.test_the_power".

Собственно, в setup я выделяю некоторый ресурс для каждого теста. В конце концов, глядя на ресурсы, которые были созданы различными модульными тестами, я хотел бы узнать, какой из них был создан с помощью теста. Лучше всего было бы просто использовать имя теста при создании ресурса.

Ответы

Ответ 1

Вы также можете сделать это с помощью Fixture Request:

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

Ответ 2

Методы 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 ===========================

Ответ 3

Вы также можете использовать PYTEST_CURRENT_TEST окружения PYTEST_CURRENT_TEST установленную pytest для каждого теста.

Переменная окружения PYTEST_CURRENT_TEST

Чтобы получить только название теста:

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

Ответ 4

У вас может быть несколько тестов, и в этом случае...

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

Ответ 5

Попробуйте type(self).__name__ возможно?

Ответ 6

Вы можете дать модуль проверки, попробуйте.

import inspect

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


foo()

Вывод: My name is: foo