2014-10-16 9 views
26

मैं अंत तक परीक्षण के लिए सेलेनियम का उपयोग कर रहा हूं और मुझे setup_class और teardown_class विधियों का उपयोग करने का तरीका नहीं मिल रहा है।मैं अपने पायस्टेस्ट क्लास को टेस्ट के साथ सही तरीके से सेटअप और टियरडाउन कैसे करूं?

मुझे setup_class विधि में ब्राउज़र सेट अप करने की आवश्यकता है, फिर क्लास विधियों के रूप में परिभाषित परीक्षणों का एक गुच्छा करें और आखिरकार teardown_clas एस विधि में ब्राउज़र छोड़ दें।

लेकिन तर्कसंगत रूप से यह खराब समाधान लगता है, क्योंकि वास्तव में मेरे परीक्षण कक्षा के साथ काम नहीं करेंगे, बल्कि वस्तु के साथ काम करेंगे। अलग से, सही

class TestClass: 

    def setup_class(cls): 
     pass 

    def test_buttons(self, data): 
     # self.$attribute can be used, but not cls.$attribute? 
     pass 

    def test_buttons2(self, data): 
     # self.$attribute can be used, but not cls.$attribute? 
     pass 

    def teardown_class(cls): 
     pass 

और यह भी वर्ग .. यह हर के लिए बनाया जाना चाहिए के लिए ब्राउज़र उदाहरण बनाने के लिए सही होने के लिए नहीं लगता है ऑब्जेक्ट: मैं हर परीक्षा पद्धति के अंदर self परम गुजरती हैं, तो मैं वस्तुओं 'वार्स उपयोग कर सकते हैं ?

तो, setup_class और teardown_class के बजाय मुझे __init__ और __del__ विधियों का उपयोग करने की आवश्यकता है?

+0

+1 यह हमेशा मुझे भी खराब कर देता है। Setup_instance (self) और teardown_instance (स्वयं) विधियां क्यों नहीं हैं? (या शायद सेटअप/teardown_object?) क्या यह अधिक सही नहीं होगा ओओ? – cbare

उत्तर

25

जब आप "वर्ग के तरीकों के रूप में परिभाषित परीक्षण", तुम सच में क्या मतलब है वर्ग तरीकों (तरीकों जो पहले पैरामीटर के रूप में अपनी वर्ग प्राप्त) या बस नियमित तरीके (तरीकों के रूप में एक उदाहरण प्राप्त लिखना पहला पैरामीटर)?

अपने उदाहरण परीक्षण तरीकों मैं उत्तरार्द्ध संभालने कर रहा हूँ के लिए self का उपयोग करता है, तो आप सिर्फ बजाय setup_method उपयोग करने की आवश्यकता के बाद से:

class Test: 

    def setup_method(self, test_method): 
     # configure self.attribute 

    def teardown_method(self, test_method): 
     # tear down self.attribute 

    def test_buttons(self): 
     # use self.attribute for test 

परीक्षा पद्धति उदाहरण setup_method और teardown_method को पारित कर दिया है, लेकिन हो सकता है अगर आपके सेटअप/टियरडाउन कोड को परीक्षण संदर्भ जानने की आवश्यकता नहीं है तो अनदेखा किया गया है। अधिक जानकारी here मिल सकती है।

मैं यह भी सिफारिश करता हूं कि आप अपने आप को py.test के fixtures से परिचित करें, क्योंकि वे एक अधिक शक्तिशाली अवधारणा हैं।

+0

आपने 'क्लास टेस्ट' क्यों लिखा था, न कि 'क्लास टेस्ट (ऑब्जेक्ट)'? –

+0

मैं ज्यादातर पाइथन 3 में अपने उदाहरण दिखाता हूं, यही कारण है कि मैंने परेशान नहीं किया। :) –

+0

ओह? मैंने सोचा कि किसी को 'क्लास टेस्ट (ऑब्जेक्ट)' लिखना चाहिए, लेकिन मुझे पूरा यकीन नहीं है कि मैंने इसे कहाँ से लिया था। –

10

जैसा कि @ ब्रूनो ने सुझाव दिया है कि पाइस्टेस्ट फिक्स्चर का उपयोग करना एक और समाधान है जो परीक्षण कक्षाओं या यहां तक ​​कि केवल सरल परीक्षण कार्यों दोनों के लिए सुलभ है। Here's an example testing python2.7 functions:

import pytest 

@pytest.fixture(scope='function') 
def some_resource(request): 
    stuff_i_setup = ["I setup"] 

    def some_teardown(): 
     stuff_i_setup[0] += " ... but now I'm torn down..." 
     print stuff_i_setup[0] 
    request.addfinalizer(some_teardown) 

    return stuff_i_setup[0] 

def test_1_that_needs_resource(some_resource): 
    print some_resource + "... and now I'm testing things..." 

तो, चल test_1... पैदा करता है:

I setup... and now I'm testing things... 
I setup ... but now I'm torn down... 

सूचना है कि stuff_i_setup स्थिरता में संदर्भित है, उस वस्तु setup और torn down परीक्षण यह सहभागिता कर के लिए होने के लिए अनुमति देता है। आप कल्पना कर सकते हैं कि यह एक सतत वस्तु के लिए उपयोगी हो सकता है, जैसे एक काल्पनिक डेटाबेस या कुछ कनेक्शन, जिसे अलग-अलग रखने के लिए प्रत्येक परीक्षण चलाने से पहले इसे साफ़ किया जाना चाहिए।

23

Fixture finalization/executing teardown codeaddfinalizer का उपयोग "ऐतिहासिक" है।

ऐतिहासिक नोट के रूप में, टियरडाउन कोड लिखने का एक और तरीका आपके फ़ंक्शन फ़ंक्शन में अनुरोध ऑब्जेक्ट स्वीकार कर रहा है और उसका अनुरोध कॉल कर सकता है।addfinalizer एक या एक से अधिक बार:

सेटअप और टियरडाउन के लिए मौजूदा सबसे अच्छा अभ्यास चल रहा है यह

$ py.test --capture=no pytest_yield.py 
=== test session starts === 
platform darwin -- Python 2.7.10, pytest-3.0.2, py-1.4.31, pluggy-0.3.1 
collected 1 items 

pytest_yield.py setup 
testing resource 
.teardown 


=== 1 passed in 0.01 seconds === 
+0

तो क्या आप इसे प्रत्येक टेस्ट फ़ाइल में कॉपी करते हैं जिसे आपको संसाधन की आवश्यकता होगी? –

+0

@AndyHayden आप अपने फिक्स्चर को कैसे लिखते हैं, इस पर निर्भर करते हुए, आप इसे प्रत्येक टेस्ट फ़ाइल में डाल सकते हैं जहां आपको इसकी आवश्यकता है या आप इसे conftest.py फ़ाइल में डाल सकते हैं https://stackoverflow.com/questions/34466027/in-py- परीक्षण-क्या-उपयोग-का-कॉन्स्टेस्ट-पीई-फाइल –

+0

हालांकि यह क्लास सेटअप नहीं है, है ना? यह कक्षा में प्रत्येक परीक्षण विधि से पहले निष्पादित होगा। – malhar

5

में जो परिणाम आपके कोड काम करना चाहिए जैसा कि आप उम्मीद बस के रूप में yield

import pytest 

@pytest.fixture() 
def resource(): 
    print("setup") 
    yield "resource" 
    print("teardown") 

class TestResource(object): 
    def test_that_depends_on_resource(self, resource): 
     print("testing {}".format(resource)) 

उपयोग करने के लिए है यदि आप @classmethod सजावटी जोड़ते हैं।

@classmethod 
def setup_class(cls): 
    "Runs once per class" 

@classmethod 
def teardown_class(cls): 
    "Runs at end of class" 

http://pythontesting.net/framework/pytest/pytest-xunit-style-fixtures/

1

देखें इस http://docs.pytest.org/en/latest/xunit_setup.html

मदद कर सकता है अपने परीक्षण सूट में, मैं वर्गों में अपने परीक्षण मामलों समूह। सेटअप और टियरडाउन के लिए मुझे उस कक्षा में सभी परीक्षण मामलों की आवश्यकता है, मैं setup_class(cls) और teardown_class(cls) क्लासमेड का उपयोग करता हूं। अब

lh = <got log handler from logger module> 

class TestClass: 
    @classmethod 
    def setup_class(cls): 
     lh.info("starting class: {} execution".format(cls.__name__)) 

    @classmethod 
    def teardown_class(cls): 
     lh.info("starting class: {} execution".format(cls.__name__)) 

    def setup_method(self, method): 
     lh.info("starting execution of tc: {}".format(method.__name__)) 

    def teardown_method(self, method): 
     lh.info("starting execution of tc: {}".format(method.__name__)) 

    def test_tc1(self): 
     <tc_content> 
     assert 

    def test_tc2(self): 
     <tc_content> 
     assert 

जब मैं अपने परीक्षण चलाने के लिए, जब TestClass निष्पादन है:

और सेटअप और टियरडाउन मैं परीक्षण का मामला से प्रत्येक के लिए की जरूरत के लिए, मैं setup_method(method) और teardown_method(methods)

उदाहरण का उपयोग प्रारंभ होने पर, यह निष्पादन शुरू होने पर विवरणों को लॉग करता है, जब यह निष्पादन समाप्त होता है और विधियों के लिए समान होता है ..

आप संबंधित स्थानों में अन्य सेटअप और टियरडाउन चरणों को जोड़ सकते हैं ।

उम्मीद है कि यह मदद करता है!

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

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