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

j'utilise py.test et me demande si et comment il est possible de récupérer le nom de la cours d'exécution de test au sein de l' setup méthode qui est invoquée avant d'exécuter chaque test. Considérer 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 les setup comme indiqué dans le code via test_name = ... alors que test_name=="TestSomething.test_the_power".

en fait, en 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 lequel a été créé par quel test. La meilleure chose serait d'utiliser le nom de test lors de la création de la ressource.

20
demandé sur Jan-Philip Gehrcke 2013-07-18 18:55:47

6 réponses

Vous pouvez également le faire en utilisant le Demande D'Installation comme ceci:

def test_name1(request):
    testname = request.node.name
    assert testname == 'test_name1'
47
répondu danielfrg 2016-01-11 22:25:24

setup et teardown les méthodes semblent être des méthodes anciennes pour supporter des tests écrits pour d'autres cadres, par exemple le nez. Le natif pytest les méthodes sont appeléessetup_method ainsi que teardown_method qui reçoivent la méthode d'essai actuellement exécutée comme argument. Par conséquent, ce que je veux accomplir, peut être écrit comme ceci:

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:

============================= 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 ===========================
11
répondu Jan-Philip Gehrcke 2013-07-19 10:50:19

Vous pouvez également utiliser le PYTEST_CURRENT_TEST variable d'environnement définie par pytest pour chaque cas de test.

PYTEST_CURRENT_TEST environment variable

Pour obtenir juste le nom du test:

os.environ.get('PYTEST_CURRENT_TEST').split(':')[-1].split(' ')[0]
1
répondu Joao Coelho 2018-08-21 19:31:40

type(self).__name__ peut-être?

0
répondu kindall 2013-07-18 15:02:25

vous pourriez avoir plusieurs tests, dans ce cas...

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

...vous donnera toutes les fonctions et les variables d'instance qui commencent par "test_" dans self. Tant que vous n'avez pas de variables nommées "test_something" cela va fonctionner.

vous pouvez aussi définir une méthode setup_method(self, method) au lieu de setup(self) et cela sera appelé avant chaque invocation de méthode d'essai. En utilisant ceci, vous êtes simplement donné chaque méthode comme paramètre. Voir: http://pytest.org/latest/xunit_setup.html

0
répondu ejk314 2013-07-18 15:17:16

vous pouvez donner au module d'inspection essayer.

import inspect

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


foo()

Sortie: My name is: foo

0
répondu Robert Caspary 2018-08-02 09:58:34