2012-10-11 11 views
7

मैं वर्तमान में डेटा से व्यवसाय तर्क को दोबारा शुरू करने के बाद, लाइब्रेरी के लिए इकाइयों के परीक्षण लिख रहा हूं, अब मैं कुछ भ्रमित राज्य में हूं कि अब तर्क का परीक्षण कैसे करें!डेटा प्रदान करने के लिए सर्वोत्तम अभ्यास - PHPUnit

उदाहरण के लिए, मेरे पास एक जटिल प्रक्रिया है जो डेटा की एक सरणी पारित हो जाती है, मैं इसके लिए डेटा प्रदाता का उपयोग करने जा रहा हूं ताकि मैं सुनिश्चित कर सकूं कि यह सभी प्रकार के मामलों के लिए काम करेगा।

डेटा प्रदाता के माध्यम से जो डेटा मैं पास करने जा रहा हूं, क्या मुझे भी अपेक्षित परिणाम पारित करना चाहिए? या इसे परीक्षण में गणना की जानी चाहिए।

जैसा कि कहा गया है, गणना के लिए प्रक्रिया काफी जटिल प्रक्रिया है, काफी $a + $b नहीं है।

उत्तर

7

डेटा प्रदाताओं के साथ, मैं अपेक्षित परिणाम भी प्रदान करता हूं। चूंकि मैं इनपुट लेने और मूल्य वापस करने की विधि चाहता हूं, इसलिए मैं गणना को दो बार लागू नहीं करना चाहता, क्योंकि कार्यान्वयन में से 1 में कोई त्रुटि हो सकती है।

मैं एक नकली उपयोग नहीं कर रहा हूं क्योंकि मैं वास्तव में प्रश्नों/कार्यों के प्रश्नों का परीक्षण कर रहा हूं।

यदि हम 4 पैरामीटर के आधार पर कुछ की गणना कर रहे हैं, तो मेरा डेटा प्रदाता 5 पास होगा। पहला पैरामीटर अपेक्षित परिणाम है, उसके बाद विधि/फ़ंक्शन को पारित करने वाले पैरामीटर के बाद।

इस से, मेरे कॉल सुंदर सीधे आगे है:

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     array('127.0.0.1', NULL,   '127.0.0.1'), 
     array('127.0.0.1', '127.0.0.1', NULL), 
     ); 
} 

/** 
* @dataProvider GetRemoteAddressFromWebServerDataProvider 
*/ 
public function testGetRemoteAddressFromWebServer($Result, $HTTPXSetting, $RemoteAddress) 
{ 
    $_SERVER['HTTP_X_FORWARDED_FOR'] = $HTTPXSetting; 
    $_SERVER['REMOTE_ADDR']   = $RemoteAddress; 
    $this->assertEquals($Result, GetRemoteAddressFromWebServer()); 
} 
+2

इससे भी बदतर, यदि आप दो बार तर्क लागू करते हैं, तो कार्यान्वयन के दोनों में समान त्रुटि हो सकती है। –

8

स्टीवन के उदाहरण का विस्तार करने के लिए, यह कभी कभी प्रत्येक डेटा सेट के लिए एक नाम प्रदान करने के लिए सहायक हो सकता है। जब कोई विफल रहता है, तो PHPUnit विफलता संदेश में "डेटा # 0" के बजाय अपना नाम प्रदर्शित करेगा।

public static function GetRemoteAddressFromWebServerDataProvider() 
{ 
    return array(
     'not forwarded' => array('127.0.0.1', NULL,   '127.0.0.1'), 
     'no remote address' => array('127.0.0.1', '127.0.0.1', NULL), 
    ); 
} 
+1

धन्यवाद। यह जानना अच्छा है क्योंकि मैं नामों का उपयोग नहीं कर रहा हूं। कुछ परीक्षणों को दोबारा करने का समय। –

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