2013-01-18 27 views
12

X11'e erişmesi gereken bir Python paketim var. Xvfb'yi kullanmak istiyorum, böylece yapım makinelerinde gerçek bir X11'e sahip olmam gerekmiyor - bu durumda Hudson. Bu yüzden, py.test başladığında bir Xvfb sunucusunu başlatmak istiyorum, tüm testler için o sunucuyu kullanın, sonra kapatın.py.test Tüm test paketi için SetUp/TearDown

Bunu nasıl yapabilirim?


Not: I (durdur) başlatmak her test sınıfında Kurulum (söküm) bir Xvfb sunucu ama bu iki sorunu var olabilir: Birincisi, savurgan olduğunu. İkincisi, sunucu doğru bir şekilde sonlandırırsam ya da ölmeyen Xvfb işlemlerini asılıyorumsa, Fatal IO error 0 (Success) on X server tuhaflığı nedeniyle işe yaramıyor. Bu ilgilenen varsa xvfbwrapper kullanıyor.

+0

Tüm sınıflarınız aynı dosyada mı? Ardından, setUpModule ve tearDownModule modüllerini yalnızca – Dhara

+0

@ Dhara modülüne göre bir kez kullanabilirsiniz: Hayır, test sınıfları alt modüllere ayrılır. – Sardathrion

+0

Yine de tüm testlerinizi tek bir dosyada uygun setUpModule çağrıları ile içe aktarabilir ve testlerinizi buradan oradan çalıştırabilirsiniz – Dhara

cevap

15

pytest-xvfb'u bununla uğraşmak yerine kullanabilirsiniz… Daha kolay olurdu.


Bu aslında oldukça basittir. Bu içeren proje kök conftest.py adlı bir dosya oluşturun: Şimdi

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) 

, yapmanız gereken tek şey yapmak saçmadır 1022 için DISPLAY ayarlamak için her testleri kurmaktır. unittest modül belgelerinde açıklandığı gibi

+3

port numarasını da döndürebilirsiniz, böylece diğer armatürler argüman olarak "start_xvfb_server" ifadesini kullanarak kolayca erişebilir . Ayrıca, "autouse = True" yi kullanmak istemezsiniz, bunun yerine bir sınıfa @ pytest.mark.usefixtures ("start_xvfb_server") koyarsınız. Bu şekilde, gerekli olmayan testler için süreci kurmazsınız. – hpk42

+0

@ hpk42: Bunlar gerçekten iyi özellikler olurdu. Ancak, bunların nasıl uygulanacağından emin değilim. Dokümantasyon ve deneme zamanı ile uğraşıyorum. Kodumu düzenlemek veya kendi yanıtınızı oluşturmakta özgürsünüz. Teşekkürler. – Sardathrion

+1

Tavsiye edeceğim başka bir değişiklik de tmpdir fikstürünü tmpfile.mkdtemp kullanmak yerine start_xvfb_server içinde kullanmaktır. Bu şekilde py.test dizininizi kesinlikle konuştuğunuz gibi mkdtemp tarafından oluşturulan dizini bir noktada kaldırmanız gerekir. – flub

İlgili konular