python - framework - tutorial django
py.test: ¿cómo obtener el nombre de la prueba actual del método de configuración? (6)
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 algunos recursos 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.
Es posible que tenga múltiples 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
Los métodos de setup
y teardown
parecen ser métodos heredados para respaldar las pruebas escritas para otros marcos, por ejemplo, la nariz. Los métodos nativos de pytest
se denominan setup_method
, así como teardown_method
que reciben el método de prueba ejecutado actualmente 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]
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''
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