2013-01-18 14 views
12

Mam pakiet Pythona, który potrzebuje dostępu do X11. Chcę używać Xvfb, aby nie musieć instalować prawdziwego X11 na maszynach budujących - w tym przypadku Hudson. Tak więc chciałbym uruchomić serwer Xvfb po uruchomieniu py.test, użyć tego samego serwera dla wszystkich testów, a następnie go zamknąć.py.test SetUp/TearDown dla całego zestawu testów

Jak mogę to zrobić?


Uwaga: mogę zacząć (stop) serwer Xvfb w Setup (przerywaniem) w każdej klasie testowej, ale że ma dwa problemy: Po pierwsze, jest marnotrawstwem. Po drugie, nie działa z powodu dziwnego Fatal IO error 0 (Success) on X server, jeśli poprawnie zakończę serwer lub otrzymam zwisające procesy Xvfb, które nie umierają. To jest użycie xvfbwrapper, jeśli ktoś jest zainteresowany.

+0

Czy wszystkie zajęcia znajdują się w tym samym pliku? Następnie możesz użyć setUpModule i tearDownModule, aby robić to tylko raz na moduł – Dhara

+0

@Dhara: Nie, klasy testowe są podzielone na pod-moduły. – Sardathrion

+0

Cóż, nadal możesz importować wszystkie swoje testy w jednym pliku za pomocą odpowiednich wywołań setUpModule i uruchamiać testy stamtąd – Dhara

Odpowiedz

15

Można użyć pytest-xvfb zamiast zadzierać z tym ... Byłoby łatwiej.


To jest rzeczywiście dość proste. Utwórz plik o nazwie conftest.py w katalogu głównym projektu, który zawiera to:

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) 

Teraz, wszystko co musisz zrobić, to założyć każdy testy, aby ustawić wyświetlanie do 1022, który jest trywialny zrobić.

+3

możesz również zwrócić numer portu, aby inne urządzenia mogły z łatwością uzyskać do niego dostęp przez podanie "start_xvfb_server" jako argumentu . Możesz również nie używać "autouse = True", ale zamiast tego umieścić @ pasest.mark.usefixtures ("start_xvfb_server") na klasie. W ten sposób nie konfigurujesz procesu dla testów, które go nie potrzebują. – hpk42

+0

@ hpk42: To naprawdę dobre cechy. Jednak nie jestem pewien, jak je wdrożyć. Walczę z dokumentacją i czasem na eksperymentowanie. Możesz edytować kod lub utworzyć własną odpowiedź. Dzięki. – Sardathrion

+1

Inną zmianą, którą polecam jest użycie urządzenia tmpdir na serwerze start_xvfb_server zamiast użycia tmpfile.mkdtemp. W ten sposób py.test będzie zarządzał twoim katalogiem, ponieważ ściśle mówiąc, powinieneś w pewnym momencie usunąć katalog utworzony przez mkdtemp. – flub

Powiązane problemy