NumPy 1.14 - self.typeStr

Numpy.i टाइपमैप का परीक्षण करना




numpy

Numpy.i टाइपमैप का परीक्षण करना

परिचय

numpy.i SWIG इंटरफ़ेस फ़ाइल के लिए परीक्षण लिखना एक numpy.i सिरदर्द है। वर्तमान में, 12 अलग-अलग डेटा प्रकारों का समर्थन किया गया है, जिनमें से प्रत्येक में 74 अलग-अलग तर्क हस्ताक्षर हैं, कुल 888 टाइपमैप के लिए "बॉक्स से बाहर" का समर्थन किया गया है। इनमें से प्रत्येक टाइपमैप, बदले में, उचित और अनुचित दोनों इनपुट के लिए अपेक्षित व्यवहार को सत्यापित करने के लिए कई यूनिट परीक्षणों की आवश्यकता हो सकती है। वर्तमान में, 1,000 से अधिक व्यक्तिगत इकाई परीक्षणों में यह परिणाम तब होता है जब make test numpy/tools/swig उपनिर्देशिका में चलाया जाता है।

इसी तरह की कई यूनिट परीक्षणों की सुविधा के लिए, कुछ उच्च-स्तरीय प्रोग्रामिंग तकनीकें कार्यरत हैं, जिनमें C और SWIG मैक्रो, साथ ही पायथन वंशानुक्रम शामिल हैं। इस दस्तावेज़ का उद्देश्य यह सत्यापित करने के लिए नियोजित परीक्षण बुनियादी ढांचे का वर्णन करना है कि numpy.i के numpy.i काम कर रहे हैं।

परीक्षण संगठन

एक, दो, और, तीन आयामी सरणियों के लिए क्रमशः तीन इंडेपेडेंट टेस्टिंग फ्रेमवर्क समर्थित हैं। एक आयामी सरणियों के लिए, दो C ++ फाइलें, एक हेडर और एक स्रोत हैं, नाम:

Vector.h
Vector.cxx

जिसमें फ़ंक्शन तर्कों के रूप में एक-आयामी सरणियों वाले फ़ंक्शन के लिए प्रोटोटाइप और कोड होते हैं। फ़ाइल:

Vector.i

एक SWIG इंटरफ़ेस फ़ाइल है जो एक अजगर मॉड्यूल Vector को परिभाषित करता है जो C में सरणियों को सही ढंग से संभालने के लिए numpy.i में numpy.i का उपयोग करते हुए Vector में फ़ंक्शन को लपेटता है।

Makefile Vector.py - Vector.py और Vector_wrap.cxx Vector.py उत्पन्न करने के लिए Vector.py कॉल करता है, और Vector_wrap.cxx को भी निष्पादित करता है जो Vector_wrap.cxx संकलित करता है और प्लेटफॉर्म के आधार पर एक्सटेंशन मॉड्यूल _Vector.so या _Vector.dylib एक साथ जोड़ता है। यह एक्सटेंशन मॉड्यूल और प्रॉक्सी फ़ाइल Vector.py - Vector.py दोनों को build डायरेक्टरी के तहत एक उपनिर्देशिका में रखा गया है।

वास्तविक परीक्षण पायथन लिपि के नाम से होता है:

testVector.py

जो मानक पायथन लाइब्रेरी मॉड्यूल का उपयोग Vector.h करता है, जो समर्थित प्रत्येक डेटा प्रकार के लिए Vector.h में परिभाषित प्रत्येक फ़ंक्शन के कई परीक्षण करता है।

दो-आयामी सरणियों का परीक्षण बिल्कुल उसी तरीके से किया जाता है। उपरोक्त विवरण लागू होता है, लेकिन Vector लिए Matrix साथ प्रतिस्थापित किया जाता है। त्रि-आयामी परीक्षणों के लिए, Vector लिए Tensor को स्थानापन्न करें। चार आयामी परीक्षणों के लिए, Vector लिए SuperTensor स्थानापन्न करें। फ्लैट में जगह सरणी परीक्षण के लिए, Vector लिए Flat विकल्प। वर्णन करने वाले विवरणों के लिए, हम Vector परीक्षणों का संदर्भ लेंगे, लेकिन Matrix , Tensor और SuperTensor परीक्षणों पर भी यही जानकारी लागू होती है।

कमांड make test यह सुनिश्चित करेगा कि सभी टेस्ट सॉफ्टवेयर बनाए जाएं और फिर सभी तीन टेस्ट स्क्रिप्ट चलाएं।

परीक्षण हैडर फ़ाइलें

Vector.h एक C ++ हैडर फ़ाइल है जो C मैक्रो को परिभाषित करता है जिसे TEST_FUNC_PROTOS कहा जाता है जो दो तर्क लेता है: TYPE , जो डेटा प्रकार का नाम है जैसे unsigned int ; और SNAME , जो कि बिना रिक्त स्थान वाले समान डेटा प्रकार के लिए एक छोटा नाम है, जैसे uint । यह मैक्रो कई फ़ंक्शन प्रोटोटाइप को परिभाषित करता है जिसमें उपसर्ग SNAME और कम से कम एक तर्क होता है जो टाइप TYPE का एक सरणी है। वे कार्य जिनके पास वापसी तर्क हैं, एक TYPE मान लौटाते हैं।

TEST_FUNC_PROTOS को तब numpy.i द्वारा समर्थित सभी डेटा प्रकारों के लिए कार्यान्वित किया numpy.i :

  • signed char
  • unsigned char
  • short
  • unsigned short
  • int
  • unsigned int
  • long
  • unsigned long
  • long long
  • unsigned long long
  • float
  • double

परीक्षण स्रोत फ़ाइलें

Vector.cxx एक C ++ स्रोत फ़ाइल है जो Vector.h . Vector.h में निर्दिष्ट फ़ंक्शन प्रोटोटाइप में से प्रत्येक के लिए Vector.h कोड को लागू करता है। यह एक C मैक्रो TEST_FUNCS को परिभाषित करता है जिसमें समान तर्क होते हैं और उसी तरह से काम करते हैं जैसे TEST_FUNC_PROTOS करता है। TEST_FUNCS उपरोक्त 12 डेटा प्रकारों में से प्रत्येक के लिए लागू किया गया है।

परीक्षण SWIG इंटरफ़ेस फ़ाइलें

Vector.i एक SWIG इंटरफ़ेस फ़ाइल है जो अजगर मॉड्यूल Vector को परिभाषित करती है। यह इस अध्याय में वर्णित numpy.i रूप में उपयोग करने के लिए सम्मेलनों का numpy.i करता है। यह एक SWIG मैक्रो %apply_numpy_typemaps को परिभाषित करता है जिसमें एकल तर्क TYPE । यह Vector.h में पाए गए तर्क हस्ताक्षर को प्रदान किए गए Vector.h को लागू %apply लिए SWIG निर्देश %apply का उपयोग करता है। यह मैक्रो तब numpy.i द्वारा समर्थित सभी डेटा प्रकारों के लिए लागू किया numpy.i । यह तब %include "Vector.h" में फ़ंक्शन प्रोटोटाइप के सभी को लपेटने के लिए %include "Vector.h" को %include "Vector.h" करता है।

पायथन लिपियों का परीक्षण

टेस्टिंग एक्सटेंशन मॉड्यूल के निर्माण के लिए make का उपयोग करने के बाद, testVector.py को निष्पादित करने के लिए testVector.py जा सकता है। यूनिट स्क्रिप्ट की सुविधा के लिए testVector.py उपयोग करने वाली अन्य लिपियों के साथ, testVector.py एक वर्ग को परिभाषित करता है जो unittest.TestCase से विरासत में मिला है:

class VectorTestCase(unittest.TestCase):

हालाँकि, यह वर्ग सीधे नहीं चलाया जाता है। बल्कि, यह कई अन्य अजगर वर्गों के लिए एक आधार वर्ग के रूप में कार्य करता है, प्रत्येक एक विशेष डेटा प्रकार के लिए विशिष्ट है। VectorTestCase क्लास टाइपिंग जानकारी के लिए दो तार संग्रहीत करता है:

self.typeStr
एक स्ट्रिंग जो कि SNAME उपसर्गों में से एक से मेल खाती है जिसका उपयोग Vector.h और Vector.cxx में किया जाता है। उदाहरण के लिए, "double"
self.typeCode
एक छोटा (आम तौर पर एकल-वर्ण) स्ट्रिंग जो डेटा प्रकार को नुकीले में दर्शाता है और self.typeStr से मेल self.typeStr । उदाहरण के लिए, यदि self.typeStr "double" , तो self.typeCode "d" होना चाहिए।

VectorTestCase क्लास द्वारा परिभाषित प्रत्येक परीक्षण उस पायथन फ़ंक्शन को निकालता है जो Vector के Vector को एक्सेस करके परीक्षण करने की कोशिश कर रहा है:

length = Vector.__dict__[self.typeStr + "Length"]

दोहरे परिशुद्धता परीक्षणों के मामले में, यह पायथन फ़ंक्शन Vector.doubleLength . Vector.doubleLength

फिर हम एक छोटी परिभाषा के साथ प्रत्येक समर्थित डेटा प्रकार के लिए एक नया टेस्ट केस क्लास परिभाषित करते हैं:

class doubleTestCase(VectorTestCase):
    def __init__(self, methodName="runTest"):
        VectorTestCase.__init__(self, methodName)
        self.typeStr  = "double"
        self.typeCode = "d"

इन 12 वर्गों में से प्रत्येक को एक unittest.TestSuite में एकत्र किया जाता है, जिसे तब निष्पादित किया जाता है। त्रुटियों और विफलताओं को एक साथ अभिव्यक्त किया जाता है और निकास तर्क के रूप में वापस किया जाता है। कोई भी गैर-शून्य परिणाम इंगित करता है कि कम से कम एक परीक्षा पास नहीं हुई।