2013-01-18 11 views
12

मेरे पास एक पायथन पैकेज है जिसे X11 तक पहुंच की आवश्यकता है। मैं एक्सवीएफबी का उपयोग करना चाहता हूं ताकि मुझे इस मशीन में बिल्ड मशीनों - हडसन पर वास्तविक एक्स 11 स्थापित करने की आवश्यकता न हो। इसलिए, जब मैं py.test शुरू होता हूं, तो मैं एक एक्सवीएफबी सर्वर शुरू करना चाहता हूं, सभी परीक्षणों के लिए उस सर्वर का उपयोग करें, फिर इसे बंद करें।py.test पूरे परीक्षण सूट के लिए SetUp/TearDown

मैं यह कैसे कर सकता हूं?


नोट: मैं (बंद) प्रत्येक परीक्षा कक्षा में सेटअप (टियरडाउन) में एक Xvfb सर्वर शुरू कर सकता है लेकिन यह है कि दो समस्या है: सबसे पहले, यह बेकार है। दूसरा, यह अजीब Fatal IO error 0 (Success) on X server के कारण काम नहीं करता है अगर मैं सर्वर को सही तरीके से समाप्त करता हूं या मुझे मरने वाली Xvfb प्रक्रियाएं मिलती हैं जो मर नहीं जाती हैं। यदि कोई दिलचस्पी लेता है तो यह xvfbwrapper का उपयोग कर रहा है।

+0

क्या आपकी सभी कक्षाएं एक ही फ़ाइल में हैं? फिर, आप मॉड्यूल – Dhara

+0

@Dhara: नहीं, परीक्षण कक्षाओं को उप-मॉड्यूल में विभाजित करने के लिए केवल एक बार ऐसा करने के लिए setUpModule और tearDownModule का उपयोग कर सकते हैं। – Sardathrion

+0

ठीक है, आप अभी भी अपने सभी परीक्षणों को उचित सेटअप मॉड्यूल कॉल के साथ एक ही फाइल में आयात कर सकते हैं, और वहां से अपने परीक्षण चला सकते हैं – Dhara

उत्तर

15

आप 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) 

, तुम सब करने के लिए है 1022 जो करने के लिए मामूली बात है करने के लिए प्रदर्शन सेट करने के लिए प्रत्येक परीक्षण स्थापित करने के लिए है।

+3

आप पोर्ट नंबर भी वापस कर सकते हैं ताकि अन्य फिक्स्चर आसानी से "start_xvfb_server" को तर्क के रूप में बताकर आसानी से एक्सेस कर सकें । इसके अलावा आप "autouse = True" का उपयोग नहीं करना चाहेंगे, बल्कि इसके बजाय कक्षा में @ pytest.mark.usefixtures ("start_xvfb_server") डाल दें। इस तरह आप परीक्षणों की प्रक्रिया को सेट नहीं करते हैं, इसकी आवश्यकता नहीं है। – hpk42

+0

@ एचपीके 42: वे वास्तव में अच्छी सुविधाएं होंगी। हालांकि, मुझे यकीन नहीं है कि उनको कैसे कार्यान्वित किया जाए। मैं प्रयोग करने के लिए प्रलेखन और समय के साथ संघर्ष कर रहा हूँ। या तो मेरे कोड को संपादित करने या अपने आप का जवाब बनाने के लिए स्वतंत्र महसूस करें। धन्यवाद। – Sardathrion

+1

एक और परिवर्तन जो मैं अनुशंसा करता हूं वह tmpfile.mkdtemp का उपयोग करने के बजाय start_xvfb_server में tmpdir स्थिरता का उपयोग करना है। इस तरह py.test आपकी निर्देशिका को सख्ती से बोलने के रूप में प्रबंधित करेगा, आपको किसी बिंदु पर mkdtemp द्वारा बनाई गई निर्देशिका को हटाना चाहिए। – flub

4

वैकल्पिक रूप से, आप बस setUpClass/tearDownClass तरीकों, unittest मॉड्यूल दस्तावेज़ में वर्णित के रूप में परिभाषित कर सकते हैं: https://docs.python.org/2/library/unittest.html#unittest.TestCase.setUpClass

py.test v2.4 के बाद से, वे पूरी तरह से समर्थित हैं। यह आधिकारिक दस्तावेज पृष्ठ सभी xunit-style संगत विधियों को भी दस्तावेज करता है: https://pytest.org/latest/xunit_setup.html