2012-09-22 11 views
6

PHP/Xdebug के साथ इस कोड (विंडोज 7 x64 पर Xdebug 2.2.1 और PHP 5.4 का उपयोग कर, यह भी मैं पठनीयता के लिए एक लाइन काउंटर जोड़ लिया है):PHP में Xdebug क्या करता है?

1: xdebug_start_code_coverage(); 
2: 
3: for ($ii = 0; $ii < 3; ++$ii) 
4: $x = time(); 
5: 
6: if (false) 
7: echo "Never executed."; 
8: 
9: echo var_dump(xdebug_get_code_coverage()); 

..मैं इस आउटपुट प्राप्त (मैं बदलाव कर दिया है कुछ मान इसे और अधिक पठनीय बनाने के लिए):

array (size=1) 
    '..\testpage.php' => 
    array (size=4) 
     3 => int 1 
     4 => int 1 
     7 => int 1 
     9 => int 1 

Xdebug के स्थल पर अधिक प्रलेखन कहते हैं:

"तत्वों में मूल्य पर निष्पादन इकाइयों की कुल संख्या का प्रतिनिधित्व करता है इस लाइन को निष्पादित किया गया है। "

स्रोत: http://www.xdebug.com/docs/code_coverage

तो जाहिरा तौर पर उत्पादन गलत है। लाइन 3 और 4 को तीन बार निष्पादित किया जाना चाहिए था जबकि Xdebug ने क्रमशः 1 कहा था। लाइन 6 को एक बार निष्पादित किया जाना चाहिए था, Xdebug बिल्कुल नहीं कह रहा था। लाइन 7 निश्चित रूप से निष्पादित नहीं किया जाना चाहिए था, फिर भी Xdebug ने कहा कि यह एक बार निष्पादित किया गया था। यह कहा जाना चाहिए कि उत्पादन घुंघराले ब्रेसिज़ के साथ या बिना रहता है।

इस यूआरएल पर

से अधिक: http://xdebug.org/archives/xdebug-general/0377.html

.. Derick Rethans कह पकड़ा है (7 साल पहले!) है कि किसी तरह प्रलेखन गलत है (और अभी भी है), कि Xdebug केवल रिटर्न -1, 0 या 1 हालांकि, जैसा कि मेरा उदाहरण दिखाता है, एक्सडेबग सीधे 1 लौटता है और कठोर काउंटर अपने चयन को मनमाना बनाता है। यहां तक ​​कि यदि Xdebug -1, 0 या 1 लौटा, तो मुझे नहीं पता कि वे मान क्या कहते हैं।

तो, आप में से कोई भी कुलीन कोडर का विचार है ?? और यदि Xdebug के साथ गंभीरता से कुछ गड़बड़ है, तो क्या इसका मतलब यह है कि मैं प्रोफाइलिंग और कोड कवरेज के लिए उपयोग किए जाने वाले किसी अन्य एप्लिकेशन और प्लगइन पर भरोसा नहीं कर सकता हूं, जो कि बदले में Xdebug का उपयोग करते हैं? मैं फ़िंग और PHPUnit सोच रहा हूं जो एक आम शादी प्रतीत होता है।

यदि आप इस मुद्दे पर कुछ विस्तारित करना चाहते हैं; यदि Xdebug दोषपूर्ण है और ऐसे में, सभी निर्भर अनुप्रयोग, आप PHP में कोड कवरेज रिपोर्ट के लिए क्या उपयोग करते हैं?

संपादित: उत्पादन एक ही कोड उदाहरण का उपयोग ऊपर सूचीबद्ध है, अगर मैं तर्क XDEBUG_CC_UNUSED या XDEBUG_CC_DEAD_CODExdebug_start_code_coverage लिए भेज तर्कों के रूप में कोई बदलाव नहीं है। मुझे लगता है कि Xdebug कोड कवरेज के लिए बिल्कुल काम नहीं करता है, न कि मेरे सिस्टम पर।

+0

शायद PHP पदव्याख्यायित्र अभी भी यह पढ़ सकते हैं और इसके लिए मूल कोड भले ही यह निष्पादित नहीं किया जाएगा उत्पन्न करने के लिए है? –

+0

कोल, मैं शर्त लगाता हूं कि आप लाइन 7 और हाँ के बारे में सोच रहे हैं, यह मामला हो सकता है। लेकिन क्या Xdebug पूरी तरह से बेकार नहीं होगा अगर वह ऐसी चीज के लिए जिम्मेदार नहीं था? और फिर भी, लाइन 3, 4 और 6 की समस्या है। –

+1

मैंने Xdebug का कभी भी उपयोग नहीं किया है, इसलिए मैं निश्चित उत्तर नहीं दे सकता, लेकिन (http://www.digipedia.pl/usenet/thread/15739/ 883 /) ऐसा लगता है कि यह वास्तव में निष्पादित करने के लिए लाइन की संख्या को वापस नहीं करता है। – kennypu

उत्तर

4

मुझे पता है कि इंडेंटेशन सिंटैक्स के साथ सशर्त का उपयोग करते समय कोई समस्या है।

एक्सडीबग केवल "कथन" के बारे में जानता है और वास्तव में "रेखाएं" नहीं समझता है, भले ही यह प्रदर्शित होता है और इसके बारे में बात की जाती है।

यह:

1 <?php 
2 
3 xdebug_start_code_coverage(); 
4 
5 for ($ii = 0; $ii < 3; ++$ii) { 
6  $x = time(); 
7 } 
8 
9 if (false) { 
10 echo "Never executed."; 
11 } 
12 
13 echo var_dump(xdebug_get_code_coverage()); 

पैदा करता है:

array(1) { 
    ["./test.php"]=> 
    array(5) { 
    [5] => int(1) 
    [6] => int(1) 
    [7] => int(1) 
    [9] => int(1) 
    [13] => int(1) 
    } 
} 

अधिक जानकारी के लिए देखें: Edge Cases PHPUnit मैनुअल

और अन्य अतः सवालों में:

+0

Thankyou Willoller, आपकी टिप्पणी निश्चित रूप से सहायक थी। लेकिन अब मैं और भी उलझन में हूँ। मैंने आपके कोड को दोबारा बनाया और उसी आउटपुट को मिला। मुझे आश्चर्य है कि क्यों Xdebug लाइन 7 कहता है और लाइन 11 निष्पादित नहीं किया गया था (या यह __statement__ 7 और __statement__ 11 है?)? –

+0

मेरे कोड 7 पर निष्पादित किया गया है क्योंकि 6 है। 11 ऐसा नहीं है क्योंकि 10 नहीं है। पिछला '} 'किसी भी व्यक्ति के लिए एक झुकाव है जो 100% कवरेज के लिए अनिवार्य है। इसे संबोधित करने के लिए, phpUnit ने '// @ codeCoverageIgnore' (?) जोड़ा ताकि आप इसे ब्रेसिज़ के बाद रख सकें:'} // @ codeCoverageIgnore'। Blech। – willoller