Question

I have a Python package that needs access to X11. I want to use Xvfb so that I do not have to have a real X11 installed on the build machines -- Hudson in this case. So, I would like to start a Xvfb server when py.test starts, use that one server for all the tests, then close it down.

How can I do that?


Note: I could start(stop) an Xvfb server in the SetUp(TearDown) in each test class but that has two problem: First, it is wasteful. Second, it does not work due to either strange Fatal IO error 0 (Success) on X server if I terminate the server correctly or I get hanging Xvfb processes that do not die. This is using xvfbwrapper if anyone is interested.

Was it helpful?

Solution

You could use pytest-xvfb instead of messing with this… It would be easier.


It is actually fairly simple. Create a file called conftest.py in your project root which contains this:

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)

Now, all you have to do is to set up each tests to set the DISPLAY to 1022 which is trivial to do.

OTHER TIPS

Alternatively, you can simply define setUpClass / tearDownClass methods, as described in the unittest module documentation: https://docs.python.org/2/library/unittest.html#unittest.TestCase.setUpClass

Since py.test v2.4, they are fully supported. This official documentation page also documents all xunit-style compatible methods: https://pytest.org/latest/xunit_setup.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top