2013-07-23 4 views
13

मैं कक्षाओं के एक सेट के साथ सेलेनियम परीक्षण लिख रहा हूं, प्रत्येक वर्ग में कई परीक्षण होते हैं। प्रत्येक वर्ग वर्तमान में खुल जाता है और उसके बाद फ़ायरफ़ॉक्स, जो दो परिणाम है बंद कर देता है:सभी कक्षाओं में सभी परीक्षणों से पहले एक विधि कैसे चलाएं?

  • सुपर धीमी गति से, खोलने फ़ायरफ़ॉक्स एक कक्षा में परीक्षण चल रहा है से अधिक समय लेता ...
  • दुर्घटनाओं, क्योंकि बाद फ़ायरफ़ॉक्स बंद कर दिया गया, की कोशिश कर रहा सेलेनियम से वास्तव में इसे फिर से खोलने के लिए, 'त्रुटि 54'

मैं नींद जोड़कर, त्रुटि 54 को हल कर सकता हूं, लेकिन यह अभी भी धीमा हो जाएगा।

तो, मैं जो करना चाहता हूं वह सभी परीक्षण कक्षाओं में एक ही फ़ायरफ़ॉक्स उदाहरणों का पुन: उपयोग कर रहा है। जिसका अर्थ है कि मुझे सभी टेस्ट क्लास से पहले एक विधि चलाने की ज़रूरत है, और सभी टेस्ट क्लास के बाद एक और तरीका है। तो, 'setup_class' और 'teardown_class' पर्याप्त नहीं हैं।

+0

[ 'scope'] (http://pytest.org/latest/fixture.html#working-with-a- मॉड्यूल- शेर- मिश्रण) 'मॉड्यूल' तक पर्याप्त नहीं है? – Bakuriu

+0

वेबब्रोसर को बंद करने के लिए, अंत में, अंत में चलाने के लिए मुझे एक फ़ंक्शन की आवश्यकता है। मैं प्रत्येक वर्ग/मॉड्यूल के बाद वेबब्रोसर को बंद नहीं करना चाहता हूं। न ही मैं चाहता हूं कि इसे कभी भी बंद न किया जाए। –

+0

फिर यह बहुत आसान है: ['atexit'] (http://docs.python.org/2/library/atexit.html) का उपयोग करें और उस फ़ंक्शन को पंजीकृत करें जो दुभाषिया से बाहर निकलने से पहले फ़ायरफ़ॉक्स को निष्पादित करने के लिए बंद कर देगा। – Bakuriu

उत्तर

24

आप एक सत्र-दायरे वाले "autouse" स्थिरता का उपयोग करना चाहें:

# content of conftest.py or a tests file (e.g. in your tests or root directory) 

@pytest.fixture(scope="session", autouse=True) 
def do_something(request): 
    # prepare something ahead of all tests 
    request.addfinalizer(finalizer_function) 

यह सभी परीक्षणों से आगे चलेंगे। अंतिम परीक्षण समाप्त होने के बाद फाइनलर को बुलाया जाएगा।

14

hpk42 द्वारा सुझाए गए सत्र स्थिरता का उपयोग कई मामलों में काम करेगा, लेकिन सभी परीक्षण एकत्र किए जाने के बाद स्थिरता ही चलती है। आप परीक्षण संग्रह से पहले कोड को चलाना चाहते हैं, तो आप एक प्रयोग खराब pytest_configure या pytest_sessionstart प्रलेखित:

# content of conftest.py 

def pytest_sessionstart(session): 
    """ before session.main() is called. """ 
    pass 

def pytest_sessionfinish(session, exitstatus): 
    """ whole test run finishes. """ 
    pass 
5

संस्करण 2.10 से शुरू वहाँ एक क्लीनर तरीका है और साथ ही स्थिरता फाड़ इसके दायरे को परिभाषित करने के लिए है। तो आप इस वाक्य विन्यास का उपयोग हो सकता है:

@pytest.fixture(scope="module", autouse=True) 
def my_fixture(): 
    print ('INITIALIZATION') 
    yield param 
    print ('TEAR DOWN') 

autouse पैरामीटर: documentation से:

यहाँ है कैसे autouse जुड़नार अन्य कार्यक्षेत्रों में काम करते हैं:

  • autouse जुड़नार का पालन करना दायरा = कीवर्ड-तर्क: यदि किसी ऑटोज़ फ़िक्स्चर में स्कोप = 'सत्र' है तो यह केवल एक बार चलाया जाएगा, इससे कोई फर्क नहीं पड़ता कि i एस परिभाषित किया गया है। स्कोप = 'क्लास' का अर्थ है कि यह प्रत्येक कक्षा में एक बार चलाया जाएगा, आदि

  • यदि किसी ऑटोज़ फ़िक्स्चर को परीक्षण मॉड्यूल में परिभाषित किया गया है, तो इसके सभी परीक्षण फ़ंक्शंस स्वचालित रूप से इसका उपयोग करते हैं।

  • यदि एक autouse स्थिरता को conftest.py फ़ाइल में परिभाषित किया गया है तो इसकी निर्देशिका के नीचे सभी परीक्षण मॉड्यूल में सभी परीक्षण स्थिरता का आह्वान करेंगे।

    ...

"अनुरोध" पैरामीटर: ध्यान दें कि "अनुरोध" पैरामीटर अपने उद्देश्य के लिए आवश्यक है, हालांकि आप अन्य प्रयोजनों के लिए उपयोग कर सकते हैं नहीं है।documentation से:

स्थापना "स्थिरता समारोह अनुरोध वस्तु स्वीकार कर सकते हैं आत्मनिरीक्षण करने के लिए" का अनुरोध "परीक्षण समारोह, वर्ग या मॉड्यूल संदर्भ .."

+0

यह सबसे अद्यतित है और इसे ऊपर उठाया जाना चाहिए। – gbonetti

संबंधित मुद्दे