如何让py.test识别子目录中的conftest.py?

时间:2013-09-01 13:00:30

标签: python pytest

所以,我只是失去了,试图找出为什么py.test没有执行我的autouse,会话范围的设置和拆卸灯具。最后我偶然发现了(帽子提示this SO comment!)plugins documentation中的这个小花絮:

  

请注意,默认情况下,子目录中的conftest.py文件未在工具启动时加载。

在我的项目中,我在conftest.py子目录中获得了py.test文件(tests/和测试文件),这似乎是一个非常标准的设置。如果我在tests目录中运行py.test,一切都正常运行。如果我在项目根目录中运行py.test,测试仍会运行,但 setup / teardown例程永远不会被执行

问题:

  • 使用户能够从项目根目录正确运行测试的“规范”方法是什么?将conftest.py放在根目录中对我来说很奇怪,因为我觉得所有与测试相关的文件都应保留在tests子目录中。
  • 为什么(设计方面)在默认情况下未加载的子目录中不是conftest.py?我发现这种行为至少可以说,考虑到默认情况下会发现子目录中的 tests ,所以在查找conftest文件时似乎也没有太多的额外工作。
  • 最后,如何在子目录中加载conftest.py(即远离默认值)?我在文档中找不到这个。我想避免额外的控制台 参数如果可能的话,我可以在配置文件中放置任何内容 诸如此类的东西?

我非常感谢任何洞察力和提示,当我能够为我的项目编写测试时,我觉得我很多时候会浪费/浪费时间来诊断这个问题。 : - (

最小例子:

# content of tests/conftest.py
# adapted from http://pytest.org/latest/example/special.html
import pytest
def tear_down():
    print "\nTEARDOWN after all tests"

@pytest.fixture(scope="session", autouse=True)
def set_up(request):
    print "\nSETUP before all tests"
    request.addfinalizer(tear_down)

测试文件:

# content of tests/test_module.py
class TestClassA:
    def test_1(self):
        print "test A1 called"
    def test_2(self):
        print "test A2 called"

class TestClassB:
    def test_1(self):
        print "test B1 called"

控制台输出:

pytest_experiment$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items 

tests/test_module.py test A1 called
.test A2 called
.test B1 called
.

====================================================== 3 passed in 0.02 seconds ======================================================
pytest_experiment$ cd tests/
pytest_experiment/tests$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items 

test_module.py 
SETUP before all tests
test A1 called
.test A2 called
.test B1 called
.
TEARDOWN after all tests


====================================================== 3 passed in 0.02 seconds ======================================================

1 个答案:

答案 0 :(得分:11)

在#pylib IRC频道上获得一些帮助后,发现这是py.test 2.3.4中已修复的错误。