19

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

我怎样才能做到这一点?


注意:我可以在每个测试类的 SetUp(TearDown) 中启动(停止)一个 Xvfb 服务器,但这有两个问题:首先,它很浪费。Fatal IO error 0 (Success) on X server其次,如果我正确终止服务器或者我挂起不会死的 Xvfb 进程,它会因为奇怪而不起作用。如果有人感兴趣, 这是使用xvfbwrapper 。

4

2 回答 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,这很简单。

于 2013-01-18T14:22:16.773 回答
4

或者,您可以简单地定义setUpClass/tearDownClass方法,如unittest模块文档中所述: https ://docs.python.org/2/library/unittest.html#unittest.TestCase.setUpClass

从 py.test v2.4 开始,完全支持它们。这个官方文档页面还记录了所有 xunit 样式的兼容方法: https ://pytest.org/latest/xunit_setup.html

于 2015-02-15T12:42:34.917 回答