2013-01-18 13 views
12

Ho un pacchetto Python che richiede l'accesso a X11. Voglio usare Xvfb in modo che non debba avere un vero X11 installato sulle macchine di compilazione - Hudson in questo caso. Quindi, vorrei avviare un server Xvfb all'avvio di py.test, utilizzare quel server per tutti i test, quindi chiuderlo.py.test SetUp/TearDown per l'intera suite di test

Come posso farlo?


Nota: Potrei iniziare (arresto) un server Xvfb nel setup (tearDown) in ogni classe di test, ma che ha due problemi: in primo luogo, si tratta di uno spreco. In secondo luogo, non funziona a causa di uno strano Fatal IO error 0 (Success) on X server se termino il server correttamente o impanto processi Xvfb che non muoiono. Questo sta usando xvfbwrapper se qualcuno è interessato.

+0

Tutte le classi sono nello stesso file? Quindi, è possibile utilizzare setUpModule e tearDownModule per farlo solo una volta per modulo – Dhara

+0

@Dhara: No, le classi di test sono suddivise in sottomoduli. – Sardathrion

+0

Bene, puoi ancora importare tutti i tuoi test in un singolo file con le appropriate chiamate setUpModule ed eseguire i tuoi test da lì – Dhara

risposta

15

Potresti usare pytest-xvfb invece di scherzare con questo ... Sarebbe più facile.


In realtà è abbastanza semplice. Creare un file chiamato conftest.py nella root progetto che contiene questo:

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) 

Ora, tutto ciò che dovete fare è impostare ogni test per impostare il display a 1022 che è banale da fare.

+3

potresti anche restituire il numero di porta in modo che altri dispositivi possano facilmente accedervi dichiarando "start_xvfb_server" come argomento . Inoltre potresti non voler usare "autouse = True" ma invece metti @ pytest.mark.usefixtures ("start_xvfb_server") su una classe. In questo modo non si imposta il processo per i test che non ne hanno bisogno. – hpk42

+0

@ hpk42: quelle sarebbero davvero buone caratteristiche. Tuttavia, non sono sicuro di come implementarli. Sto lottando con la documentazione e il tempo di sperimentare. Sentiti libero di modificare il mio codice o creare una tua risposta. Grazie. – Sardathrion

+1

Un'altra modifica che suggerirei è di usare l'apparecchio tmpdir in start_xvfb_server invece di usare tmpfile.mkdtemp. In questo modo py.test gestirà la tua directory come strettamente parlando, dovresti rimuovere la directory creata da mkdtemp ad un certo punto. – flub