我有一个需要访问X11的Python包。我想使用Xvfb,这样我就不必在构建机器上安装真正的X11 - 在这种情况下是Hudson。因此,我想在py.test启动时启动一个Xvfb服务器,使用该服务器进行所有测试,然后将其关闭。
我该怎么做?
注意:我可以在每个测试类的SetUp(TearDown)中启动(停止)Xvfb服务器,但这有两个问题:首先,它很浪费。其次,如果我正确终止服务器或者挂起不死的Xvfb进程,它就会因为奇怪的Fatal IO error 0 (Success) on X server
而无效。如果有兴趣的话,这是使用xvfbwrapper。
答案 0 :(得分:17)
你可以使用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,这是微不足道的。
答案 1 :(得分: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