web-dev-qa-db-fra.com

py.test: comment obtenir le nom du test actuel à partir de la méthode de configuration?

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.

27

Vous pouvez également le faire en utilisant le Request Fixture comme ceci:

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

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 ===========================
14
Jan-Philip Gehrcke

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]
9
Joao Coelho

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

1
ejk314

Essayez type(self).__name__ peut-être?

0
kindall

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

0
Robert Caspary