整个测试套件的py.test SetUp/TearDown

19

我有一个需要访问X11的Python软件包。我想使用Xvfb,这样我就不必在构建机器上安装真正的X11——在这种情况下是Hudson。因此,我想在py.test启动时启动Xvfb服务器,对所有测试使用该服务器,然后关闭它。

如何做到这一点?


注意:我可以在每个测试类的SetUp(TearDown)中启动(停止)Xvfb服务器,但这会出现两个问题:第一,这是浪费的。第二,由于我正确终止了服务器,所以要么出现奇怪的 Fatal IO error 0 (Success) on X server 错误,要么出现挂起的Xvfb进程无法关闭。如果有人感兴趣,这是使用xvfbwrapper时的情况。


你所有的类都在同一个文件中吗?那么,你可以使用setUpModule和tearDownModule来确保每个模块只执行一次。 - Dhara
@Dhara:不,测试类被分成了子模块。 - Sardathrion - against SE abuse
你仍然可以使用适当的setUpModule调用将所有测试导入单个文件中,并从那里运行你的测试。 - Dhara
2个回答

20
你可以使用 pytest-xvfb 来代替手动操作... 这样会更容易。
实际上非常简单。在你的项目根目录下创建一个名为 conftest.py 的文件,其中包含以下内容:
import pytest
import os
import subprocess
import tempfile

@pytest.fixture(scope="session", autouse=True)
def start_xvfb_server (request):
    tempdir = tempfile.mkdtemp()
    xvfb_cmd = ['Xvfb',
                ':1022',
                '-screen', '0', '800x600x24',
                '-fbdir', tempdir,
                '-noreset'
    ]
    xvfb_proc = subprocess.Popen(xvfb_cmd,
            stdout=open(os.devnull),
            stderr=open(os.devnull),
            shell=False
    )
    request.addfinalizer(xvfb_proc.kill)

现在,你所需要做的就是设置每个测试以将DISPLAY设置为1022,这很容易做到。


3
为了让其他测试夹具可以通过 "start_xvfb_server" 作为参数轻松访问它,您还可以返回端口号。另外,您可能不想使用 "autouse=True",而是在类或其他地方放置 @pytest.mark.usefixtures("start_xvfb_server")。这样做可以避免对无需该过程的测试进行设置。 - hpk42
@hpk42:这些确实是很好的功能。但是,我不确定如何实现它们。我正在努力阅读文档并尝试实验。请随意编辑我的代码或创建您自己的答案。谢谢。 - Sardathrion - against SE abuse
1
我建议的另一个更改是在start_xvfb_server中使用tmpdir fixture,而不是使用tmpfile.mkdtemp。这样,py.test将严格管理您的目录,因为您应该在某个时候删除mkdtemp创建的目录。 - flub
@flub:看起来你的编辑被拒绝了。你能否写一个答案呢?你能否添加一个简单单元测试中如何使用fixture的示例?我会点赞的。 - Sardathrion - against SE abuse

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接