Python 整个测试套件的py.test设置/拆卸

Python 整个测试套件的py.test设置/拆卸,python,unit-testing,pytest,xvfb,Python,Unit Testing,Pytest,Xvfb,我有一个Python包,需要访问X11。我想使用Xvfb,这样就不必在构建机器上安装真正的X11——在本例中是Hudson。因此,我想在py.test启动时启动一个Xvfb服务器,将该服务器用于所有测试,然后关闭它 我该怎么做 注意:我可以在每个测试类的设置(拆卸)中启动(停止)Xvfb服务器,但这有两个问题:首先,这是浪费。其次,如果我正确终止服务器,或者我挂起了没有死掉的Xvfb进程,那么由于X服务器上奇怪的致命IO错误0(成功),它将无法工作。如果有人感兴趣,可以使用此选项 你可以使用它

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

我该怎么做


注意:我可以在每个测试类的设置(拆卸)中启动(停止)Xvfb服务器,但这有两个问题:首先,这是浪费。其次,如果我正确终止服务器,或者我挂起了没有死掉的Xvfb进程,那么由于X服务器上奇怪的
致命IO错误0(成功),它将无法工作。如果有人感兴趣,可以使用此选项

你可以使用它,而不是把它弄乱……这样会更容易


其实很简单。在项目根目录中创建一个名为
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,这很简单。

或者,您可以简单地定义
setUpClass
/
tearDownClass
方法,如
unittest
模块文档中所述:

自py.test v2.4以来,它们得到了完全支持。 此官方文档页还记录了所有xunit风格兼容的方法:

您的所有课程都在同一个文件中吗?然后,您可以使用setUpModule和tearDownModule每次只执行一次module@Dhara:否,测试类被拆分为子模块。您仍然可以使用适当的setUpModule调用将所有测试导入到单个文件中,然后从那里运行测试。您还可以返回端口号,以便其他设备可以通过将“start_xvfb_server”作为参数轻松访问它。另外,您可能不想使用“autouse=True”,而是将@pytest.mark.useffixtures(“start_xvfb_server”)放在一个类上。这样,您就不会为不需要它的测试设置进程。@hpk42:这些确实是很好的功能。然而,我不知道如何实施这些措施。我正在努力准备文档和实验时间。请随意编辑我的代码或创建自己的答案。谢谢。我建议的另一个更改是在start_xvfb_服务器中使用tmpdir fixture,而不是使用tmpfile.mkdtemp。这样,py.test将严格地管理您的目录。您应该在某个时候删除由mkdtemp创建的目录。@flub:看来您的编辑被拒绝了。你能用它写个答案吗?您能否添加一个关于如何在简单单元测试中使用夹具的示例?我将投票表决。