silverstripe-framework/dev/CliTestReporter.php
Sean Harvey b20b6e0f95 Merged from 2.3
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@76269 467b73ca-7a2a-4603-9d3b-597d59a354a9
2009-05-06 06:36:16 +00:00

102 lines
3.1 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Test reporter optimised for CLI (ie, plain-text) output
*
* @package sapphire
* @subpackage testing
*/
class CliTestReporter extends SapphireTestReporter {
/**
* Display error bar if it exists
*/
public function writeResults() {
$passCount = 0;
$failCount = 0;
$testCount = 0;
$errorCount = 0;
foreach($this->suiteResults['suites'] as $suite) {
foreach($suite['tests'] as $test) {
$testCount++;
($test['status'] == 1) ? $passCount++ : $failCount++;
}
}
echo "\n\n";
if ($failCount == 0) {
echo SSCli::text(" ALL TESTS PASS ", "white", "green");
} else {
echo SSCli::text(" AT LEAST ONE FAILURE ", "white", "red");
}
echo "\n\n$testCount tests run: " . SSCli::text("$passCount passes", null) . ", ". SSCli::text("$failCount fails", null) . ", and 0 exceptions\n";
if(function_exists('memory_get_peak_usage')) {
echo "Maximum memory usage: " . number_format(memory_get_peak_usage()/(1024*1024), 1) . "M\n\n";
}
$totalTime = array_sum($this->testSpeeds);
echo "Total time: " . round($totalTime,3) . " seconds\n";
// Use sake dev/tests/all --showslow to show slow tests
if((isset($_GET['args']) && is_array($_GET['args']) && in_array('--showslow', $_GET['args'])) || isset($_GET['showslow'])) {
$avgSpeed = round(array_sum($this->testSpeeds) / count($this->testSpeeds), 3);
echo "Slow tests (more than twice the average $avgSpeed seconds):\n";
arsort($this->testSpeeds);
foreach($this->testSpeeds as $k => $v) {
// Ignore below-average speeds
if($v < $avgSpeed*2) break;
echo " - $k: " . round($v,3) . "\n";
}
}
echo "\n";
}
public function endTest( PHPUnit_Framework_Test $test, $time) {
// Status indicator, a la PHPUnit
switch($this->currentTest['status']) {
case TEST_FAILURE: echo SSCli::text("F","red", null, true); break;
case TEST_ERROR: echo SSCli::text("E","red", null, true); break;
case TEST_INCOMPLETE: echo SSCli::text("I","yellow"); break;
case TEST_SUCCESS: echo SSCli::text(".","green"); break;
default: echo SSCli::text("?", "yellow"); break;
}
static $colCount = 0;
$colCount++;
if($colCount % 80 == 0) echo " - $colCount\n";
parent::endTest($test, $time);
$this->writeTest($this->currentTest);
}
protected function writeTest($test) {
if ($test['status'] != 1) {
$filteredTrace = array();
$ignoredClasses = array('TestRunner');
foreach($test['trace'] as $item) {
if(
isset($item['file'])
&& strpos($item['file'], 'PHPUnit/Framework') === false
&& (!isset($item['class']) || !in_array($item['class'], $ignoredClasses))) {
$filteredTrace[] = $item;
}
if(isset($item['class']) && isset($item['function']) && $item['class'] == 'PHPUnit_Framework_TestSuite'
&& $item['function'] == 'run') break;
}
echo "\n\n" . SSCli::text($this->testNameToPhrase($test['name']) . "\n". $test['message'] . "\n", 'red', null, true);
echo SSCli::text("In line {$test['exception']['line']} of {$test['exception']['file']}" . "\n\n", 'red');
echo Debug::get_rendered_backtrace($filteredTrace, true);
echo "\n--------------------\n";
}
}
}