Py.test SetUp/TearDown для всего набора тестов
У меня есть пакет Python, которому нужен доступ к X11. Я хочу использовать Xvfb, чтобы у меня не было реального X11, установленного на машинах сборки - Хадсон в этом случае. Итак, я хотел бы запустить сервер Xvfb при запуске py.test, использовать один сервер для всех тестов, а затем закрыть его.
Как я могу это сделать?
Примечание. Я мог бы запустить (остановить) сервер Xvfb в SetUp (TearDown) в каждом тестовом классе, но у него две проблемы: во-первых, это расточительно. Во-вторых, это не работает из-за странного Fatal IO error 0 (Success) on X server
, если я закончу сервер правильно, или я получаю зависание процессов Xvfb, которые не умирают. Это используется xvfbwrapper, если кому-то это интересно.
Ответы
Ответ 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