Подтвердить что ты не робот

Py.test SetUp/TearDown для всего набора тестов

У меня есть пакет Python, которому нужен доступ к X11. Я хочу использовать Xvfb, чтобы у меня не было реального X11, установленного на машинах сборки - Хадсон в этом случае. Итак, я хотел бы запустить сервер Xvfb при запуске py.test, использовать один сервер для всех тестов, а затем закрыть его.

Как я могу это сделать?


Примечание. Я мог бы запустить (остановить) сервер Xvfb в SetUp (TearDown) в каждом тестовом классе, но у него две проблемы: во-первых, это расточительно. Во-вторых, это не работает из-за странного Fatal IO error 0 (Success) on X server, если я закончу сервер правильно, или я получаю зависание процессов Xvfb, которые не умирают. Это используется xvfbwrapper, если кому-то это интересно.

4b9b3361

Ответ 1

Вы можете использовать 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, что тривиально.

Ответ 2

В качестве альтернативы вы можете просто определить методы 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