py.test: ¿cómo obtener el nombre de la prueba actual del método de configuración?

Estoy usando py.test y me pregunto si / cómo es posible recuperar el nombre de la prueba actualmente ejecutada dentro del método de setup que se invoca antes de ejecutar cada prueba. Considere este código:

 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 

Justo antes de que se ejecute TestSomething.test_the_power , me gustaría tener acceso a este nombre en la setup como se describe en el código a través de test_name = ... así que test_name == "TestSomething.test_the_power" .

En realidad, en la setup , asigno algún recurso para cada prueba. Al final, mirando los recursos que han sido creados por varias pruebas de unidad, me gustaría poder ver cuál fue creado por qué prueba. Lo mejor sería usar el nombre de la prueba al crear el recurso.

También puedes hacer esto usando el accesorio de solicitud de esta manera:

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

Los métodos de setup y teardown parecen ser métodos heredados para soportar pruebas escritas para otros marcos, por ejemplo, nariz. Los métodos nativos de pytest se denominan setup_method así como teardown_method que reciben el método de prueba actualmente ejecutado como un argumento. Por lo tanto, lo que quiero lograr, se puede escribir así:

 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 

La salida de py.test -s entonces es:

 ============================= 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 =========================== 

También puede usar la variable de entorno PYTEST_CURRENT_TEST establecida por pytest para cada caso de prueba.

Variable de entorno PYTEST_CURRENT_TEST

Para obtener sólo el nombre de la prueba:

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

Es posible que tenga varias pruebas, en cuyo caso …

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

… le dará todas las funciones y variables de instancia que comienzan con “test_” en self . Mientras no tengas ninguna variable llamada “test_something” esto funcionará.

También puede definir un método setup_method(self, method) lugar de setup(self) y se llamará antes de cada invocación del método de prueba. Usando esto, simplemente te dan cada método como un parámetro. Consulte: http://pytest.org/latest/xunit_setup.html

Trate de type(self).__name__ tal vez?

Usted podría dar el módulo de inspección son intentar.

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

Salida: My name is: foo