2012-03-21 5 views
5

unittest लिएक्या प्रो-प्रोसेस-अलगाव विकल्प के साथ PhpUnit परीक्षण डीबग करना संभव है?

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     $a = 18; 
    } 
} 
लाइन 5 पर ब्रेकप्वाइंट साथ

"$ एक = 18,",

  • Xdebug v2.1.0,
  • PHPUnit 3.6.10,
  • पीएचपी 5.3.6 ,
  • ubuntu 10,11

इकाई चल रहा है नो-प्रोसेस-अलगाव विकल्प के साथ परीक्षण लाइन 5 पर स्क्रिप्ट निष्पादन को रोकता है, जैसा कि अपेक्षित है। --process-अलगाव विकल्प के साथ एक ही विन्यास रनिंग लाइन पर निष्पादन नहीं रुकती 5.

विकल्प --process-अलगाव https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php

में runJob समारोह में उपयोग करते हुए 'proc_open' नई प्रक्रिया में हर परीक्षण चलाता है डीबगर प्लगइन के साथ PhpStorm 3 और vim 7 के साथ परीक्षण किया गया। यह PHPUnit को डीबग करने की अनुमति देता है, लेकिन टेस्टकेस नहीं।

क्या Xdebug का उपयोग करके PhpUnit द्वारा बनाई गई बाल प्रक्रिया को डीबग करने का कोई तरीका है? ज़ेंड डीबगर हो सकता है?

+0

मैं PHP तूफान या वीआईएम में डिबगिंग के लिए सेटअप नहीं कर रहा हूं, इसलिए आपको इसे आजमा देना होगा। यदि आप किसी भी तरह से पर्यावरण चर से बाहर निकल सकते हैं तो आप Xdebug या ZendDebugger को उन लोगों के साथ ट्रिगर कर सकते हैं। उदाहरण उदाहरण QUERY_STRING = "start_debug = 1 और debug_host = 10.1.1.17 और no_remote = 1 और debug_port = 10000 और debug_stop = 1"/usr/local/bin/php /var/www/test.php (http://kb.zend.com/index.php देखें = एंट्री और एंट्रीआईडी ​​= 130)। Xdebug उदाहरण निर्यात XDEBUG_CONFIG = "idekey = session_name" (http://xdebug.org/docs/remote)। मुझे बताएं कि क्या वह काम करता है। – SamHennessy

+0

@ सैमहेनेस हाँ, यह सीएलआई स्क्रिप्ट को डीबग करने का बिल्कुल सही तरीका है। जादू 'निर्यात' कमांड के बाद पर्यावरणीय चर मौजूद हो गए। सीएलआई स्क्रिप्ट को डीबग करने में कोई समस्या नहीं है। जैसा कि मैंने उल्लेख किया है, जब मैं PHPUnit एक ही थ्रेड में टेस्टकेस चलाता हूं तो मैं unittests डीबग कर सकता हूं: 'phpunit नमूना टेस्ट' एक आकर्षण की तरह काम करता है। 'Phpunit - प्रोसेस-अलगाव नमूनाटेस्ट' काम नहीं करता है। अंतिम आदेश 2 प्रक्रियाएं बनाता है: मुख्य PHPUnit, और प्रत्येक परीक्षण के लिए एक बच्चा। मैं केवल मुख्य प्रक्रिया को डीबग कर सकता हूं, लेकिन बच्चे नहीं, और यह एक समस्या है। –

+1

मेरी धारणा यह थी कि PHPUnit के तहत चलाया गया उपयोगकर्ता वही उपयोगकर्ता होगा जैसा उपयोगकर्ता proc_open ऑपरेशन में उपयोग किया जाता है। यदि यह सच है तो इसे अतिरिक्त डीबग सत्रों को ट्रिगर करना चाहिए। मुझे नहीं पता कि वीआईएम या पीएचपी तूफान कई डीबग सत्रों का समर्थन कर सकता है या नहीं। इसे काम करने के लिए आपको अपनी प्रोफ़ाइल में env vars सेट करने की आवश्यकता हो सकती है। – SamHennessy

उत्तर

2

PHPStorm परियोजना सेटिंग्स में जाकर - पीएचपी - डीबग और Xdebug स्थापित करने के लिए "पहली पंक्ति पर बल तोड़ जब स्क्रिप्ट परियोजना के बाहर है" ..

यह कुछ main() प्रणाली पर तोड़ना चाहिए .. और अगर आप कुछ बार (या फिर से शुरू करें) पर कदम उठाएं, यह आपके परीक्षण तक पहुंच जाएगा

+0

** हां: ** यह PHPUnit की पहली पंक्ति पर रुक जाता है। जैसा कि मैं कह रहा था, रिमोट डीबग श्रोता, या स्थानीय डीबगर (शिफ्ट-एफ 9) का उपयोग कर PHPUnit को डीबग करने में कोई समस्या नहीं है। ** नहीं: ** यह मेरे परीक्षण तक नहीं पहुंच जाएगा। यदि आप 'कदम ऊपर' या यहां तक ​​कि 'कदम' करते हैं तो आप अपने परीक्षण में ब्रेकपॉइंट तक नहीं पहुंचते हैं। डीबगर [proc_open] द्वारा बनाई गई बाल प्रक्रिया में कदम नहीं उठाता है (http://php.net/manual/en/function.proc-open.php) –

1

यह एक सही उत्तर नहीं है, लेकिन आप एक stack उत्पन्न करने के लिए xdebug_start_trace() और xdebug_stop_trace() कॉल के साथ कोड के किसी भी ब्लॉक को घेर सकते हैं कोड के लक्षित ब्लॉक के लिए ट्रेस करें। मैंने इसका इस्तेमाल यह देखने के लिए किया है कि यह अन्य लोगों के कोड का परीक्षण करते समय मेरे यूनिट परीक्षणों में विशिष्ट बिंदुओं पर क्या हो रहा है।

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
    } 
} 

बस ध्यान रखें कि किसी भी विफलताओं PHPUnit के अपवाद संचालक कदम और एक छोटे से अजीब देखने के लिए स्टैक ट्रेस पैदा करने के लिए कारण होगा में रखें। अगर आपको कोई त्रुटि मिल रही है, तो आप बाहर निकलने के द्वारा एक साफ निशान प्राप्त कर सकते हैं; xdebug_stop_trace के बाद सही कॉल करें:

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
     exit; 
    } 
} 
+0

ठीक है, यह एक विकल्प है, साथ ही var_dump()। 2 समस्याएं हैं: इसे डिबगिंग उद्देश्यों के लिए कोड बदलने की आवश्यकता है, और यह [दृश्य डीबगर] (http://www.jetbrains.com/phpstorm/features/index.html#Visual_PHP_Debugger) के रूप में इंटरैक्टिव नहीं है। इस समय मैं जिस कामकाज का उपयोग करता हूं वह परीक्षण के लिए असाइन किया गया एक अनूठा समूह है, इसलिए इस समूह के लिए phpunit चलाना इस परीक्षण को अलगाव में निष्पादित करता है। –

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