मेरे पास एक ही सार आधार वर्ग के विभिन्न कार्यान्वयन के साथ एक मॉड्यूल है। उदाहरण के तौर पर, मान लीजिए कि मैं बेस क्लास collections.abc.Collection के साथ कक्षाओं का परीक्षण करना चाहता हूं, जिनमें सभी append(element) और __contains__ हैं। मुझे ऐसा कुछ चाहिए:

import collections
collection_classes = [list, collections.deque]

@pytest.parameter_values(collection_classes)  # what I'm looking for
def test_contains(CollectionClass):
    collection = CollectionClass()
    words = ["foo", "bar", "baz"]
    for word in words:
        collection.append(word)
    for word in words:
        assert word in collection

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

मैं अभी क्या कर रहा हूँ

मेरे पास 3 वर्ग हैं जो समान इंटरफ़ेस को लागू करते हैं। एक कार्य-आसपास के रूप में, मैंने परीक्षण कोड को 3 अलग-अलग फाइलों में कॉपी किया जो लगभग समान दिखते हैं, शीर्ष पर आयात को छोड़कर:

# speicific_collection is different for the 3 classes
from foo.module import specific_collection as CollectionClass

चूंकि मैं अकेला डेवलपर हूं और चूंकि मैं इसके लिए अक्सर परीक्षण नहीं जोड़ रहा हूं, यह कोई बड़ी बात नहीं है। मैं अभी भी जानना चाहता हूं कि इस कोड दोहराव से कैसे बचा जाए।

0
Martin Thoma 25 मार्च 2020, 06:57

1 उत्तर

सबसे बढ़िया उत्तर

अपनी कक्षाओं के साथ बस pytest.mark.parametrize का प्रयोग करें:

import pytest

collection_classes = (
    class1,
    class2
)

@pytest.mark.parametrize('cls', collection_classes)
def test_contains(cls):
    collection = cls()
    words = ["foo", "bar", "baz"]
    for word in words:
        collection.append(word)
    for word in words:
        assert word in collection        
2
MrBean Bremen 25 मार्च 2020, 06:39