pytest

2015-01-14 8 views
15

unittest में, मैं कर सकते हैं एक कक्षा में और उसके बाद इस वर्ग के तरीकों चुना कर सकते हैं वेरिएबल इसका इस्तेमाल करना चाहता है सेटअप चर ...pytest

class test_class(unittest.TestCase): 
    def setUp(self):   
     self.varA = 1 
     self.varB = 2 
     self.varC = 3 
     self.modified_varA = 2 

    def test_1(self): 
     do_something_with_self.varA, self.varB 

    def test_2(self): 
     do_something_with_self_modified_varA, self.varC 

तो unittest में, यह डाल करने के लिए आसान था बनाम unittest एक साथ परीक्षण का गुच्छा जो एक वर्ग के नीचे जा सकता है और फिर विभिन्न विधियों के लिए कई अलग-अलग चर (varA और varB) का उपयोग कर सकता है। pytest में, मैं unittest, इस तरह में एक वर्ग के बजाय conftest.py में एक दृढ़ ...

@pytest.fixture(scope="module") 
def input1(): 
    varA = 1 
    varB = 2 
    return varA, varB 

@pytest.fixture(scope="module") 
def input2(): 
    varA = 2 
    varC = 3 
    return varA, varC 

मैं एक अलग फ़ाइल में इस इनपुट 1 और मेरे कार्यों के लिए इनपुट 2 फ़ीड बनाया (के test_this.py मान लीजिए) दो अलग-अलग कार्यों के लिए। यहां प्रश्न दिए गए उपरोक्त जानकारी के आधार पर ...

  1. के बाद से मैं सिर्फ conftest.py में स्थानीय चर की घोषणा नहीं कर सकते हैं के रूप में मैं बस इस फ़ाइल को आयात नहीं कर सकते हैं। क्या यहां विभिन्न चर घोषित करने का एक बेहतर तरीका है जिसका प्रयोग test_this.py में विभिन्न कार्यों में किया जा सकता है? मेरे पास इन चर के लिए मेरे वास्तविक परीक्षण में पांच अलग-अलग कॉन्फ़िगरेशन हैं, जो conftest.py में कई अलग-अलग फ़िक्स्चर को परिभाषित करते हैं और test_this.py में पांच अलग-अलग कार्यों में फ़ंक्शन तर्क के रूप में उनका उपयोग करते हैं, दर्दनाक लगता है, मैं वापस एकजुट वर्ग संरचना, परिभाषित करने के लिए वापस जाना चाहूंगा मेरे चर और चुनें कि मैं क्या चाहता हूं

  2. क्या मुझे test_this.py में वैश्विक चर घोषित करना चाहिए और जिस तरह से मैं चाहता हूं उसे फ़ंक्शंस में उपयोग करना चाहिए? थोड़ा सा पाइथनिक लगता है। यह चर केवल इस फ़ाइल के कार्यों द्वारा उपयोग किया जाता है।

  3. मान लें कि मेरे पास test_that.py और test_them.py भी है। अगर मेरे पास इन अलग-अलग फ़ाइलों के बीच कुछ साझा चर हैं, तो मैं उन्हें कैसे घोषित करूं? निर्देशिका में केवल एक फ़ाइल calle variables.py बनाएं जहां ये सभी टेस्ट फाइलें हों और जब भी मुझे आवश्यकता हो तो आयात करें? इस तरह से मैं सभी डेटा एक अलग में रख सकता हूं।

  4. क्या यह मेरी धारणा है कि आपके कार्यों को व्यवस्थित करने के लिए कक्षा का उपयोग करके हतोत्साहित किया जाता है? हर उदाहरण मैंने ऑनलाइन पढ़ा है, यह सब केवल फिक्स्चर के साथ कार्यों का गुच्छा नियोजित प्रतीत होता है। वर्ग और विधियों को परिभाषित करने और पाइस्टेस्ट में परीक्षण व्यवस्थित करने की कॉन्फ़िगरेशन क्या है?

  5. मेरे पास एक परीक्षण परिदृश्य है जहां मुझे एक समारोह के दूसरे भाग में उपयोग करना होगा। Pytest के साथ, मेरे पास एक जोर है कि एक समारोह के अंत में एक वापसी नहीं है, इसलिए मैं इस समारोह को एक स्थिरता के रूप में उपयोग करने में सक्षम नहीं होगा। मैं इसे कैसे पूर्ण करूं ? मुझे पता है कि यह एक अच्छा अभ्यास नहीं है कि मेरा एक परीक्षण दूसरे पर निर्भर करता है लेकिन क्या वहां कोई काम है?

आपके उत्तरों के लिए अग्रिम धन्यवाद।

उत्तर

10

1) सबसे पहले आप उन फिक्स्चर को केवल conftest.py में घोषित नहीं कर सकते हैं, लेकिन प्रत्येक पायथन मॉड्यूल में आप चाहते हैं। और आप उस मॉड्यूल को आयात कर सकते हैं। इसके अलावा, आप एक ही तरह से जुड़नार उपयोग कर सकते हैं के रूप में आप सेटअप विधि का इस्तेमाल किया:

@pytest.fixture(scope='class') 
def input(request): 
    request.cls.varA = 1 
    request.cls.varB = 2 
    request.cls.varC = 3 
    request.cls.modified_varA = 2 

@pytest.usefixtures('input') 
class TestClass: 

def test_1(self): 
    do_something_with_self.varA, self.varB 

def test_2(self): 
    do_something_with_self_modified_varA, self.varC 

या आप अलग जुड़नार में अलग वैरिएबल निर्धारित कर सकते हैं:

def fixture_a(): 
    return varA 

def fixture_b(): 
    return varB 

def fixture_c(): 
    return varC 

def fixture_mod_A(): 
    return modified_varA 

या एक स्थिरता जो सभी चर लौटाता हो (क्यों नहीं?

@pytest.fixture() 
def parametrized_iput(request): 
    vars = {'varA': 1, 'varB': 2, 'varC': 3} 
    var_names = request.param 
    return (vars[var_name] for var_name in var_names) 

@pytest.mark.parametrize('parametrized_iput', [('varA', 'varC')], indirect=True) 
def test_1(parametrized_iput) 
    varA, varC = parametrized_iput 
    ... 

या यहां तक ​​कि आप स्थिरता कारखाने जो मक्खी पर आप के लिए जुड़नार कर देगा कर सकते हैं:) या यहाँ तक कि अप्रत्यक्ष parametrized स्थिरता (काफी भ्रमित रास्ता), जो अपनी पसंद से चर लौटाता हो। उत्सुकता से लगता है जब आपके पास केवल 5 परीक्षण और चर के 5 कॉन्फ़िगरेशन होते हैं, लेकिन जब आप दोनों सैकड़ों प्राप्त करते हैं, तो यह उपयोगी हो सकता है।

3) cource के कर सकते हैं आप कर सकते हैं। लेकिन मैं आपको सलाह देता हूं कि आप इस फ़ाइल को सीधे आयात न करें, लेकिन कमांड लाइन विकल्प का उपयोग करें जो इंगित करता है कि कौन सी फ़ाइल आयात करना है। इस मामले में आप अपना कोड बदलने के बिना चर के साथ एक और फ़ाइल कोहोज़ कर सकते हैं।

4) मैं अपने परीक्षणों में कक्षाओं का उपयोग करता हूं क्योंकि मैं सबसे पहले से स्थानांतरित हुआ था। मैंने pytest में कक्षाओं का उपयोग करने के साथ किसी भी समस्या का जिक्र नहीं किया।

5) उस मामले में मैं आपको बस इतना करना प्रस्ताव निम्नलिखित:

def some_actions(a, b): 
    # some actions here 
    ... 
    return c 

तो दोनों की परीक्षा में इसका इस्तेमाल करते हैं और स्थिरता:

def test(): 
    assert some_actions(1,2) == 10 

@pytest.fixture() 
def some_fixture(): 
    return some_actions(1,2) 
+0

धन्यवाद एक मुट्ठी वांछित कार्यों के साथ कार्य करना गुच्छा, मदद करता है। – LuckyStarr

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