यह एक खोज परिणाम के रूप में आया, मैंने सोचा कि इसे किसी भी व्यक्ति के लिए अनुमोदित किया जा सकता है, जो उत्पन्न जेएमएल फीडर फ़ंक्शन/कक्षा का परीक्षण करने के इस मुद्दे पर आता है।
एक्सएमएल आउटपुट का परीक्षण करने के कई तरीके सही हैं, कुछ दूसरों की तुलना में आसान है।
मैंने हाल ही में एक समान लिपि पूरी की है जिसे ओपी इस समय के बारे में पूछ रहा था।
आप एक समारोह से निम्न आंशिक एक्सएमएल उत्पादन था (के कॉल यह $ व्यक्ति> निर्गम()):
<person>
<eyes>blue</eyes>
<hair>
<style>curly</style>
</hair>
</person>
पहला विचार कोड का उपयोग करने के लिए xml उत्पन्न करने के लिए है हो सकता है और जगह है कि परीक्षण मामले में परीक्षण करने के लिए सुनिश्चित करें कि एक्सएमएल नहीं बदला है हो सकता है, कुछ इस तरह: खुश ... हालांकि, इस के विस्तार के लिए अनुमति नहीं है
function testWholeOutput() {
$person = new person();
$person->setEyes("blue");
$person->setHairStyle("curly");
$this-assertEquals(file_get_contents("data\pregenerated_xml.xml"), $person->output());
}
टेस्ट गुजरता है, हर कोई कर रहा है एक्सएमएल। एक अतिरिक्त मुद्दा यह है कि आप सचमुच परीक्षण कर रहे हैं कि आप पहले स्थान पर क्या उत्पादन कर रहे हैं, इससे लाइन के नीचे कुछ मुद्दों का कारण बन सकता है।
क्या होता है यदि एक नई सुविधा डाली जाती है जिसमें बालों के रंग के ज्ञान की आवश्यकता होती है? परीक्षण टूट जाएगा और एक्सएमएल आउटपुट की पुष्टि करने के लिए आपको स्क्रिप्ट से एक और एक्सएमएल आउटपुट करने की आवश्यकता होगी ताकि अभी भी सही तरीके से काम कर रहा हो।
इसके अतिरिक्त यदि परीक्षण तोड़ता है तो हमें पता नहीं है कि यह कहां टूट गया है, बस नई स्ट्रिंग पुरानी स्ट्रिंग से अलग है।
समाधान: PHPUnit (और assertNotTag()) assertTag() कॉल करने के लिए एक समारोह है जो एक्सएमएल के माध्यम से जाना होगा और यदि किसी टैग मौजूद है पर जोर, क्या सामग्री है और इसे सही ढंग सेटअप है इस बात की पुष्टि कर सकते हैं। निम्नलिखित की तरह कुछ को तोड़ने नहीं होगा और अधिक आइटम एक्सएमएल उत्पादन के लिए जोड़ रहे हैं:
function testOutputPersonHasEyes() {
$person = new person();
$person->setEyes("blue");
$person->setHairStyle("curly");
$this->assertTag(
array('tag' => 'person',
'child' => array('tag' => 'eyes')
),
$person->output());
}
assertTag यहाँ एक 'व्यक्ति' टैग है, जो एक बच्चे को टैग 'आंखें' है के लिए जाँच कर रहा है।अब आप कुछ इस तरह करने के लिए एक्सएमएल उत्पादन चारों ओर स्वैप करता है, तो:
<person>
<hair>
<style>curly</style>
</hair>
<eyes>blue</eyes>
</person>
आप अभी भी ऊपर परीक्षा उत्तीर्ण जाएगा, क्योंकि यह अभी भी मान्य XML, और किसी भी स्क्रिप्ट जो इस एक्सएमएल उपभोग कर रहे हैं के लिए अभी भी मान्य उत्पादन होता है।
स्पष्ट रूप से आपको यह सुनिश्चित करने के लिए परीक्षण लिखने की आवश्यकता होगी कि सामग्री की अपेक्षा की जा रही है और अन्य आइटम सही हैं लेकिन संरचना कम झूठी नकारात्मक परीक्षणों और लंबे समय तक कम काम करने की अनुमति देती है, हालांकि कुछ और समय के नुकसान के बावजूद विकास करते समय।
अतिरिक्त कार्यक्षमता के लिए, Tobias Schlitt wrote a great article phpUnit में यूनिट परीक्षण xml पीढ़ी पर, और यह एक अन्य ऑब्जेक्ट भी प्रदान करता है और इसे टेस्टकेस क्लास के चारों ओर एक रैपर का उपयोग करके और php xPath का उपयोग करके परीक्षण करता है, साथ ही साथ अच्छा ऐसा करने पर पेशेवरों/विपक्ष पर स्पष्टीकरण।
assertTag() और assetNotTag() संस्करण के रूप में अनुचित हैं 4.2 –
@ChrisK, @DougAmos, आप दोनों में से किसी का उपयोग कर के लिए एक विकल्प समाधान है PHPUnit के 'assertTag()'? – Jodes