2015-03-13 4 views
5

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

मैं वर्तमान में क्लॉवर में रिपोर्ट तैयार कर रहा हूं, लेकिन मैं अन्य रिपोर्टों के लिए बहुत खुला हूं।

मेरी परीक्षण ही काम करते हैं जब PHPUnit के रूप में चलाया जाता है:

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/ tests/aTest.php 
OK (1 test, 1 assertions) 
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/ tests/bTest.php 
OK (1 test, 1 assertions) 
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/ tests/cTest.php 
OK (1 test, 1 assertions) 

लेकिन है कि पिछले से रिपोर्ट wipping प्रत्येक रन का परिणाम देगा। तो मुझे केवल अंतिम के लिए एक रिपोर्ट मिलती है। और अगर मैं उन्हें चलाने की कोशिश करता हूं क्योंकि phpunit पूरी रिपोर्ट उत्पन्न करने की अपेक्षा करता है, तो मुझे विफलता है क्योंकि मेरे सभी वर्गों में अपने स्वयं के स्थिर शामिल हैं।

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/ tests/ 
. (first test pass) 
PHP Fatal error: Cannot redeclare class Something 
make[1]: *** [phpunit_run] Error 255 

(बल्कि इसलिए कर रहे हैं कि वे क्या नहीं मतलब ... ऊपर भी --process-isolation --no-globals-backup साथ विफल हो जाएगा) - यह अभी तक कैसे php इकाई पर ठीक से प्रक्रिया अलगाव प्राप्त करने पर एक और सवाल नहीं है। मैं इसे कई बार ठीक से चला रहा हूं, मुझे बस एक पूर्ण कवरेज रिपोर्ट चाहिए :)

क्या पहले कोड की तरह परीक्षणों को सही ढंग से चलाने के लिए कोई तरीका है (यानी कई प्रक्रियाओं पर दंडित वैश्विक वर्ग घोषणा स्थान से बचने के लिए) ब्लॉक, लेकिन अभी भी व्यापक कोड कवरेज रिपोर्ट है?

धन्यवाद!

उत्तर

7

Schleis जवाब मेरे लिए काम नहीं किया। ऑफसेट पर त्रुटि ...

लेकिन वहाँ एक बहुत ही आसान तरीका इस लक्ष्य को हासिल करने के लिए है: unserialize() विधि मेरे मामले में एक त्रुटि फेंकता वर्णित here रूप

डाउनलोड phpcov।

phpunit --coverage-php coverage/cov/foo.cov tests/foo 
phpunit --coverage-php coverage/cov/bar.cov tests/bar 

अब आप 2 .cov फ़ाइलें:

PHPUnit के साथ php कवरेज रिपोर्ट उत्पन्न है। फिर आपके पसंदीदा खोल में:

phpcov merge --clover clover.xml /coverage/cov 

यह एक क्लॉयर उत्पन्न करेगा।एक्सएमएल रिपोर्ट फ़ाइल।

1

आपको समाधान को स्क्रिप्ट करना होगा, मुझे phpunit को अन्य रनों से कवरेज जोड़ने के विकल्प के बारे में पता नहीं है। लेकिन phpunit कोड यह बहुत दर्दनाक नहीं बनाता है।

आप कवरेज रिपोर्ट प्राप्त करने के लिए --coverage-php विकल्प का उपयोग करना चाहेंगे। इससे उन्हें एक php स्क्रिप्ट का उपयोग करके सभी को गठबंधन करना आसान हो जाएगा। यह विकल्प एक धारावाहिक PHP_CodeCoverage ऑब्जेक्ट वाली फ़ाइल आउटपुट करता है। इस ऑब्जेक्ट में एक विधि merge है जिसका उपयोग रिपोर्ट को गठबंधन करने के लिए किया जा सकता है। फिर आप अपने लिए आउटपुट उत्पन्न करने के लिए उपयुक्त प्रकार की रिपोर्ट ऑब्जेक्ट का उपयोग कर सकते हैं।

https://github.com/sebastianbergmann/php-code-coverage/tree/master/src/CodeCoverage/Report

मैं .phar फ़ाइल है कि अब PHPUnit वितरित करने के लिए इस्तेमाल किया जा रहा की वजह से PHPUnit वस्तुओं सहित के साथ मुद्दों था। आप इस .gist for your own autoinclude.

आपकी स्क्रिप्ट का उपयोग कर कुछ इस तरह दिखेगा पर गौर कर सकते हैं:

$fileList = ['file1', 'file2', 'file3']; //or read from dir, however you get the list. 
$coverageReports = []; 
foreach($fileList as $file) { 
    $coverageReports[] = unserialize(file_get_contents($file)); 
} 

$mainReport = new PHP_CodeCoverage(); //Could also use one of the other ones that were generated. 

foreach($coverageReports as $coverageReport) { 
    $mainReport->merge($coverageReport); 
} 

//Change this object depending on the format you want. 
$htmlReport = new PHP_CodeCoverage_Report_HTML(); 

$htmlReport->process($mainReport); 
संबंधित मुद्दे