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

Sar*_*ica 16 python unit-testing pytest xvfb

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

我怎样才能做到这一点?


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

Sar*_*ica 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)
Run Code Online (Sandbox Code Playgroud)

现在,您所要做的就是设置每个测试以将DISPLAY设置为1022,这是微不足道的.

  • 您也可以返回端口号,以便其他灯具可以通过将"start_xvfb_server"作为参数来轻松访问它.您也可以不使用"autouse = True",而是将@ pytest.mark.usefixtures("start_xvfb_server")放在类左右.这样您就不会为不需要它的测试设置过程. (3认同)