2010-03-17 8 views
10

जब PHPUnit परीक्षण विफल रहता है, वास्तविक और अपेक्षित मान प्रदर्शित होते हैं।
लेकिन जब परीक्षण गुजरता है, तो यह जानकारी प्रदर्शित नहीं होती है।PHPUnit: जोरदार मानों का बल प्रदर्शन

PHPUnit को हमेशा अपेक्षित और वास्तविक दावे के परिणाम को प्रदर्शित करने के लिए कैसे मजबूर करें?

+3

स्पष्ट प्रश्न ... क्यों? –

+1

यह एक असामान्य अनुरोध है। ज्यादातर लोग ऐसा नहीं करना चाहते हैं। इस कारण से, इस तरह कुछ भी PHPUnit द्वारा लागू नहीं किया जाएगा। आपको इसे स्वयं करना होगा। – ryeguy

+1

असंबद्ध प्रश्न, लेकिन आपको इसकी आवश्यकता क्यों है? "सामान्य रूप से", आपको परीक्षण के दौरान उत्पादन का उत्पादन नहीं करना चाहिए, क्योंकि वहां उद्देश्य को स्वचालित रूप से निष्पादित किया जाना चाहिए (अगर सबकुछ अच्छा हो तो मनुष्य को आउटपुट पढ़ना नहीं चाहिए) –

उत्तर

3

चूंकि आप $ के साथ दावे को कॉल करने की अधिक संभावना रखते हैं-> जोर दें ...(), आप अपने परीक्षण मामले में उन विधियों को ओवरराइट कर सकते हैं। त्वरित उदाहरण:

class YourTestCase extends PHPUnit_Framework_TestCase { 
    ... 
    static private $messages = array(); 
    ... 
    static public function assertSame($var1, $var2, $message = '') { 
     parent::assertSame($var1, $var2, $message); 
     // assertSame() throws an exception if not true, so the following 
     // won't occur unless the messages actually are the same 
     $success = print_r($var1, true) . ' is the same as ' 
       . print_r($var2, true); 
     self::$messages = array_merge(self::$messages, array($success)); 
    } 

    static public function tearDownAfterClass() { 
     echo implode("\n", self::$messages); 
    } 
} 
बेशक

, tearDownAfterClass() अपनी पसंद के लिए काफी देर से नहीं हो सकता। यह एक दावा विफलता के समान नहीं है।

+0

हां, मैंने इसके बारे में भी सोचा है, लेकिन मुझे सभी दावों के लिए कोई आधार विधि नहीं मिली है। – takeshin

+0

ओह! समझा। लेकिन मुझे आश्चर्य है: क्या (यदि यह अस्तित्व में था) तो समझदार हो जाएगा? विभिन्न दावों में विभिन्न अर्थशास्त्र और विभिन्न मानदंड होते हैं। उन सभी को एक विधि में उबालने की कोशिश नहीं कर रहे हैं जो आप चाहते हैं कि प्रतिक्रिया की प्रभावशीलता पतला (या बदतर)? – pinkgothic

+0

जो मैं चाहता हूं उसके लिए एकमात्र समझदार विकल्प कमांड लाइन स्विच है। और एक कार्यान्वयन अगर यह थोड़ा और परेशानी होगी। – takeshin

11

phpunit --testdox 

चल प्रत्येक परीक्षा नाम दिखाई देगा। तो एक कामकाज के रूप में, आप शायद टेस्ट नाम के अंदर अपने अपेक्षित और वास्तविक दावे के परिणाम शामिल कर सकते हैं ... अभी भी यह एक कामकाज है ...

2

या तो create your own Assertion class और यह वास्तविक दावा वर्ग और प्रतिध्वनि के लिए प्रॉक्सी की तरह व्यवहार करता है वास्तविक दावे को प्रस्तुत करने से पहले मूल्य, उदाहरण के लिए

$this->assertWithLogging('assertion', $expected, $actual, $message); 

या PHPUnit के अपने वर्ग (जो मैं बहुत मुश्किल हो जाएगा लगता है) या बस

$this->assertSame($expected, $actual, $message); 
echo "$expected is $actual"; 

करना यही कारण है, सुंदर या तो नहीं है, क्योंकि यह उत्पादन अप पेंच होगा जब CLI के माध्यम से चल ओवरराइड। यदि आप ज़ेंड स्टूडियो का उपयोग करते हैं, तो आप डीबग आउटपुट टैब में आउटपुट देखेंगे।

एक और मार्ग TestListeners के साथ होगा, लेकिन मुझे आपको कोई विवरण बताने के लिए पर्याप्त जानकारी नहीं है। ऐसा लगता है कि आप परीक्षण प्रक्रिया में हुक कर सकते हैं।

+0

इसे पूरा करने के लिए, मैं केवल 'PHPUnit_Assert' को संशोधित कर सकता हूं, लेकिन मैं उम्मीद करता हूं कि यह कमांड लाइन स्विच मांग पर इस सुविधा के लिए है ... – takeshin

+0

@takehin कोर पुस्तकालयों को संशोधित करना है ** हमेशा ** एक बुरा विचार। अगली बार जब आप PHPUnit अपडेट करेंगे, तो आपके सभी मोड चले गए हैं। यही कारण है कि मैंने इसके बजाय एक कस्टम दावा का विस्तार या उपयोग करने का सुझाव दिया। – Gordon

+0

आप सही गॉर्डन हैं। लेकिन यह सिर्फ एक काल्पनिक विचार है। मैं PHPUnit को फिर से लिखना नहीं चाहता हूं और न ही हर जगह var_dumps डाल सकता हूं, बस जब मैं एक पल के लिए डीबग देखना चाहता हूं :) – takeshin

0

क्या आप वास्तव में केवल $ संदेश मूल्य का उपयोग कर सकते हैं ??? विधि और उस क्षेत्र में जो भी आप चाहते हैं उसे डाल दें। मैं आमतौर पर इसका उपयोग यह दिखाने के लिए करता हूं कि अपेक्षित और वास्तविक मूल्य क्या हैं और साथ ही साथ दावा के लिए एक अद्वितीय नाम है (मान लीजिए कि मेरे पास दिए गए परीक्षण में एक से अधिक हैं)।

+0

वह संदेश केवल तभी दिखाएगा जब दावा विफल हो जाता है। – pinkgothic

0

एक और चीज अपना खुद का श्रोता लिखना हो सकता है। इस तरह, आप जो आउटपुट चाहते हैं उसे दे सकते हैं और phpunit पर दावा छोड़ सकते हैं। मुझे लगता है कि यह करने के लिए यह सबसे आसान और सबसे अनुकूल तरीका हो सकता है।

3

मैं इस पोस्ट में कुछ इसी तरह की तलाश में आया था। मैं इस testcase है:

/** 
* test routing logic (numbers method returns an array of numbers and expected outputs to test) 
* @dataProvider numbers 
*/ 
function testRoute($input,$expected) 
{ 
    $route = new Route($input,'',false); 
    $route->route(); 
    $this->assertEquals($expected,$route->routingResult); 
} 

और मेरे संख्या विधि यह है:

/** 
* read pairs of numbers (input <tab> expected) from tests.input separater by tab 
* return an array like this: array(array(number1,expected1), array(number2,expected2), ...) 
* provide this array to my tests by returning it 
*/ 
function numbers() 
{ 
    $testcases = file('tests.input'); 
    $tests = array(); 
    foreach($testcases as $test_case) 
    { 
     list($input,$output) = explode("\t",$test_case,2); 
     $tests[] = array(trim($input),trim($output)); 
    } 
    return $tests; 
} 

क्या होता है आप PHPUnit से इस तरह एक आउटपुट मिलता है:

Starting test 'RouteTest::testRoute with data set #0 ('8596000000', 'rejected (dp not found)x')'. 
F 
Starting test 'RouteTest::testRoute with data set #1 ('8596000001', 'rejected (rejected by scheme)')'. 
. 
Starting test 'RouteTest::testRoute with data set #2 ('8596000003', '1599000003')'. 
. 

यह नहीं होगा जब तक परीक्षण विफल नहीं हो जाता है तब तक परीक्षण किए गए फ़ंक्शन का वास्तविक परिणाम बताएं लेकिन कम से कम आपको सभी जोरदार मानों को देखना होगा।