2013-01-18 90 views
12

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

我该怎么做?


注意:我可以开始(停止)在每个测试类的设置(TearDown中)的服务器的Xvfb但有两个问题:第一,它是一种浪费。其次,如果我正确终止了服务器,或者挂起了不死的Xvfb进程,则它不起作用,原因是奇怪的Fatal IO error 0 (Success) on X server。如果有人有兴趣,这是使用xvfbwrapper

+0

所有的类都在同一个文件中吗?然后,你可以使用setUpModule和tearDownModule每个模块 – Dhara

+0

@Dhara只这样做一次:没有,测试类分成子模块。 – Sardathrion

+0

那么,您仍然可以使用相应的setUpModule调用将所有测试导入到单个文件中,然后从那里运行测试 – Dhara

回答

15

你可以使用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) 

现在,所有你需要做的是建立每个测试,将显示器设置为1022这是容易做到。

+3

您也可以返回端口号,以便其他设备可以通过声明“start_xvfb_server”作为参数来轻松访问它。此外,您可能不想使用“autouse = True”,而是在类上放置@ pytest.mark.usefixtures(“start_xvfb_server”)。这样你就不需要为不需要它的测试设置过程。 – hpk42

+0

@ hpk42:那些确实是很好的功能。但是,我不知道如何实现这些。我正在努力处理文档和时间进行实验。随意编辑我的代码或创建自己的答案。谢谢。 – Sardathrion

+1

我建议的另一个变化是使用TMPDIR支架,start_xvfb_server而不是使用tmpfile.mkdtemp的。这样py.test会管理你的目录,严格来说你应该在某个时候删除由mkdtemp创建的目录。 – flub