आप यूनिट-टेस्ट प्रक्रियात्मक PHP, कोई समस्या नहीं कर सकते हैं। और यदि आपका कोड HTML के साथ मिश्रित है तो आप निश्चित रूप से भाग्य से बाहर नहीं हैं।
एप्लिकेशन या स्वीकृति परीक्षण स्तर पर, आपका प्रक्रियात्मक PHP शायद व्यवहार निर्धारित करने के लिए सुपरग्लोबल्स ($_POST, $_GET, $_COOKIE
इत्यादि) के मूल्य पर निर्भर करता है, और एक टेम्पलेट फ़ाइल और आउटपुट थूककर समाप्त होता है।
एप्लिकेशन-स्तरीय परीक्षण करने के लिए, आप केवल सुपरग्लोबल मान सेट कर सकते हैं; एक आउटपुट बफर शुरू करें (अपनी स्क्रीन बाढ़ से एचटीएमएल का एक गुच्छा रखने के लिए); पेज पर कॉल करें; बफर के अंदर सामान के खिलाफ जोर देना; और अंत में बफर कचरा। तो, आप कुछ इस तरह कर सकता है:
public function setUp()
{
if (isset($_POST['foo'])) {
unset($_POST['foo']);
}
}
public function testSomeKindOfAcceptanceTest()
{
$_POST['foo'] = 'bar';
ob_start();
include('fileToTest.php');
$output = ob_get_flush();
$this->assertContains($someExpectedString, $output);
}
यहां तक कि भारी का भी शामिल है, के परीक्षण के इस प्रकार आपको पता चलेगा कि आप काम या नहीं अनुप्रयोग स्तर विशेषताएं हैं बहुत से "चौखटे के लिए"। यह वास्तव में महत्वपूर्ण होगा क्योंकि आप अपना कोड सुधारना शुरू कर देते हैं, क्योंकि यदि आप आश्वस्त हैं कि डेटाबेस कनेक्टर अभी भी काम करता है और पहले से बेहतर दिखता है, तो आप एक बटन पर क्लिक करना चाहते हैं और उसे देख सकते हैं, हां, आप अभी भी डेटाबेस के माध्यम से लॉगिन और लॉगआउट।
निचले स्तर पर, परिवर्तनीय दायरे के आधार पर मामूली विविधताएं हैं और क्या कार्य साइड इफेक्ट्स (सत्य या गलत लौटते हुए) द्वारा काम करते हैं, या परिणाम सीधे वापस कर देते हैं।
क्या वेरिएबल्स स्पष्ट रूप से पारित होते हैं, पैरामीटर या कार्यों के बीच पैरामीटर के सरणी के रूप में? या कई अलग-अलग स्थानों में चर सेट हैं, और ग्लोबल्स के रूप में पूरी तरह से पारित कर रहे हैं? यदि यह (अच्छा) स्पष्ट मामला है, तो आप फ़ंक्शन को धारण करने वाली फ़ाइल सहित (1) फ़ंक्शन का परीक्षण कर सकते हैं, फिर (2) फ़ंक्शन टेस्ट मान सीधे खिला रहे हैं, और (3) आउटपुट को कैप्चर करना और इसके खिलाफ जोर देना। यदि आप ग्लोबल्स का उपयोग कर रहे हैं, तो परीक्षणों के बीच सभी ग्लोबल्स को सावधानीपूर्वक निकालने के लिए आपको अतिरिक्त सावधान रहना होगा (ऊपर, $ _POST उदाहरण में)। यह बहुत ही ग्लोबल्स को धक्का और खींचने वाले फ़ंक्शन से निपटने के दौरान परीक्षणों को बहुत छोटा (5-10 लाइन, 1-2 आवेषण) रखने में विशेष रूप से सहायक होता है।
एक और मूल मुद्दा यह है कि क्या कार्य आउटपुट लौटकर काम करता है, या पारित पैराम को बदलकर काम करता है, इसके बजाय सही/गलत लौटाता है। पहले मामले में, परीक्षण आसान है, लेकिन फिर से, यह दोनों ही मामलों में संभव है:
// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertEquals($expectedOutput, $output);
}
बुरा मामले में, जहां अपने कोड दुष्प्रभाव से काम करता है और सही या गलत रिटर्न, आप अभी भी बहुत आसानी से परीक्षण कर सकते हैं :
/* suppose your cat function stupidly
* overwrites the first parameter
* with the result of concatenation,
* as an admittedly contrived example
*/
public function testShouldConcatenateTwoStringsAndReturnTrue()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertTrue($output);
$this->Equals($expectedOutput, $stringOne);
}
उम्मीद है कि इससे मदद मिलती है।
यदि आपके द्वारा परीक्षण किए जा रहे कोड को 'निकास' के साथ परेशान किया गया है, तो यह ठीक नहीं है; बयान :( –
@YarekT अगर कोड 'निकास' या 'मरने वाले बयानों से भरा हुआ है तो कोई परीक्षण संभवतः किराया नहीं दे सकता है। सबसे टेस्टेबल तरीका अपेक्षित स्क्रिप्ट समाप्ति को संभालना एक अपवाद फेंकना और एक कस्टम अपवाद हैंडलर पंजीकृत करना है जो कि कस्टम अपवाद प्रकार को अनदेखा करने के लिए पर्याप्त स्मार्ट है। फिर आप परीक्षण कर सकते हैं कि अपेक्षित अपवाद फेंक दिया गया है। बेशक, एक अच्छी तरह से डिज़ाइन किया गया एप्लिकेशन वास्तव में ' बूटस्ट्रैप चरण के बाद कभी भी 'बाहर निकलने' या 'die' की आवश्यकता नहीं है। – rdlowrey