2013-07-18 189 views
16

我正在使用py.test,并想知道在运行每个测试之前调用setup方法内是否有可能检索当前执行的测试的名称。考虑以下代码:py.test:如何从setup方法获取当前测试的名称?

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 

权利之前TestSomething.test_the_power成为执行,我想有机会获得这个名字在setup如通过test_name = ...代码概述,使test_name == "TestSomething.test_the_power"

实际上,在setup中,我为每个测试分配了一些资源。最后,看看由各种单元测试创​​建的资源,我希望能够看到哪个测试是由哪个测试创建的。最好的办法是在创建资源时使用测试名称。

回答

8

setupteardown方法似乎是为支持其他框架,例如笔试传统方法鼻子。原生pytest方法被称为setup_method以及teardown_method,它们接收当前执行的测试方法作为参数。因此,我想实现,可以写成像这样:

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 

py.test -s输出则是:

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

尝试type(self).__name__也许?

+0

在我的例子中,这只会提供'TestSomething'。我主要是在名称的第二部分之后:) –

0

你可能有多个测试,在这种情况下...

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

...会给你所有与self“TEST_”开头的函数和实例变量。只要你没有任何名为“test_something”的变量,这个就行了。

您也可以定义一个方法setup_method(self, method)而不是setup(self),这将在每个测试方法调用之前调用。使用这个,你简单地给每个方法作为参数。请参阅:http://pytest.org/latest/xunit_setup.html

+0

代表py.test测试的所有方法都以'test'开头。我在这里需要的是py.test API,因为py.test已经事先收集了所有的测试(基本上是你在这里建议的方式),并且已经知道现在要运行哪个测试。我只是不知道要问py.test的正确问题:-) –

+0

编辑之后的注释:我不想简单地列出所有以“test_”开头的方法。从这个列表中,我正在执行一个名称/正在执行的测试方法*。而这只有py.test内部可以告诉。 –

+0

我想'setup_method'而不是'setup' – ejk314

0

您可以给检查模块尝试。

进口检查

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


foo() 

输出:我的名字是:FOO

+0

从'setup'方法中调用,显然返回'setup'。 –

+0

这对我非常有帮助,谢谢! – kroe761

35

你也可以做到这一点使用的Request Fixture这样的:

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

**这是通用答案,**同样适用于测试函数和测试方法。尽管py.test文档通常很引人注目,但它的'request'文档却非常糟糕。 'request.node'属性只记录为“底层的集合节点(取决于当前的请求范围)”。而已。我绝对不会发现这一点 - 并且怀疑其他人会有。布拉沃,青蛙丹尼尔! –

+5

但是,当测试函数被参数化时,'request.node.name'包含具有参数的唯一名称,例如, 'TEST_NAME [PARAM-other_param]'。因此,它总是使用['request.node.originalname'](http://doc.pytest.org/en/latest/writing_plugins.html#_pytest.python.Function.originalname),它提供了原始函数名完整。另请注意,这可从py.test 3.0开始。 – julen

相关问题