J'utilise py.test et je me demande si/comment il est possible de récupérer le nom du test actuellement exécuté dans la méthode setup
qui est invoquée avant d'exécuter chaque test. Considérez ce code:
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
Juste avant TestSomething.test_the_power
devient exécuté, je voudrais avoir accès à ce nom dans setup
comme indiqué dans le code via test_name = ...
pour que test_name
== "TestSomething.test_the_power"
.
En fait, dans setup
, j'alloue des ressources pour chaque test. En fin de compte, en regardant les ressources qui ont été créées par divers tests unitaires, je voudrais pouvoir voir laquelle a été créée par quel test. La meilleure chose serait d'utiliser simplement le nom du test lors de la création de la ressource.
Vous pouvez également le faire en utilisant le Request Fixture comme ceci:
def test_name1(request):
testname = request.node.name
assert testname == 'test_name1'
Les méthodes setup
et teardown
semblent être des méthodes héritées pour supporter les tests écrits pour d'autres frameworks, par exemple nez. Les méthodes natives pytest
sont appelées setup_method
aussi bien que teardown_method
qui reçoit en argument la méthode de test actuellement exécutée. Par conséquent, ce que je veux réaliser peut s'écrire comme suit:
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 sortie de py.test -s
alors c'est:
============================= 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 ===========================
Vous pouvez également utiliser le PYTEST_CURRENT_TEST
variable d'environnement définie par pytest pour chaque cas de test.
variable d'environnement PYTEST_CURRENT_TEST
Pour obtenir uniquement le nom du test:
os.environ.get('PYTEST_CURRENT_TEST').split(':')[-1].split(' ')[0]
Vous pourriez avoir plusieurs tests, auquel cas ...
test_names = [n for n in dir(self) if n.startswith('test_')]
... vous donnera toutes les fonctions et variables d'instance commençant par "test_" dans self
. Tant que vous n'avez aucune variable nommée "test_something", cela fonctionnera.
Vous pouvez également définir une méthode setup_method(self, method)
au lieu de setup(self)
et qui sera appelée avant chaque appel de méthode de test. En utilisant cela, vous obtenez simplement chaque méthode comme paramètre. Voir: http://pytest.org/latest/xunit_setup.html
Essayez type(self).__name__
peut-être?
Vous pouvez essayer le module d'inspection.
import inspect
def foo():
print "My name is: ", inspect.stack()[0][3]
foo()
Production: My name is: foo