private function getTestEvent() { $event = new Event(); $runner = $this; $event->on('preRun', function ($test) { echo 'Running Tests for: ' . get_class($test) . PHP_EOL; }); $event->on('preMethod', function ($method, $test) use($runner) { $runner->methodTime[$method]['start'] = microtime(true); }); $event->on('postMethod', function ($method, $test) use($runner) { $runner->methodTime[$method]['stop'] = microtime(true); $className = get_class($test); $start = $runner->methodTime[$method]['start']; $stop = $runner->methodTime[$method]['stop']; $time = $stop - $start; $runner->testTime += $time; $number = (string) number_format($time, 3); echo "[" . ($test->isMethodPassed($method) ? '42m[PASS]' : "41m[FAIL]") . "[0m" . str_pad(' ' . $className . '::' . $method . ' ', self::PADDING - strlen($number)) . $number . PHP_EOL; }); $event->on('postRun', function ($test) use($runner) { $number = number_format($runner->testTime, 3); $runner->totalTime += $runner->testTime; $runner->testTime = 0; echo str_pad('Total for ' . get_class($test) . ': ', self::PADDING + 6 - strlen($number), ' ', STR_PAD_LEFT) . "[1m" . $number . "[0m" . PHP_EOL; }); return $event; }
public function run(Event\Test $event = null) { if ($event) { $event->preRun($this); } $this->setUp(); $this->fixtures->install(); foreach ($this->methods as $method) { $this->currentMethod = $method; $this->methodExceptions[$method] = new ArrayIterator(); $this->methodAssertions[$method] = new AssertionArray(); if ($event) { $event->preMethod($method, $this); } set_error_handler($this->generateErrorHandler($method)); if ($this->benchmarks->has($method)) { $this->benchmarks->get($method)->start(); } try { $this->{$method}(); } catch (Exception $e) { $assertionException = new AssertionException($e); $this->exceptions->append($assertionException); $this->methodExceptions[$method]->append($assertionException); } if ($this->benchmarks->has($method)) { $this->benchmarks->get($method)->stop(); } restore_error_handler(); if ($event) { $event->postMethod($method, $this); } } $this->tearDown(); $this->fixtures->uninstall(); if ($event) { $event->postRun($this); } return $this; }
use Testes\Coverage\Coverage; use Testes\Finder\Finder; use Testes\Autoloader; use Testes\Event; $base = __DIR__ . '/..'; require $base . '/src/Testes/Autoloader.php'; Autoloader::register(); Autoloader::addPath($base . '/tests'); Autoloader::addPath($base . '/src'); Autoloader::addPath($base . '/vendor/devco'); Autoloader::addPath($base . '/vendor/devco/event-emitter/src'); $coverage = new Coverage(); $finder = new Finder($base . '/tests', 'Test'); $coverage->start(); echo PHP_EOL; $event = new Event\Test(); $event->on('postRun', function ($test) { echo $test->getAssertions()->isPassed() && !$test->getExceptions()->count() ? '.' : 'F'; }); $suite = $finder->run($event); echo PHP_EOL . PHP_EOL . sprintf('Ran %d test%s.', count($suite), count($suite) === 1 ? '' : 's'); $analyzer = $coverage->stop()->addDirectory($base . '/src')->is('\\.php$'); echo PHP_EOL . PHP_EOL . 'Coverage: ' . $analyzer->getPercentTested() . '%' . PHP_EOL . PHP_EOL; if (count($assertions = $suite->getAssertions()->getFailed())) { echo 'Assertions' . PHP_EOL; echo '----------' . PHP_EOL; foreach ($assertions as $ass) { echo ' ' . $ass->getTestClass() . ':' . $ass->getTestLine() . ' ' . $ass->getMessage() . PHP_EOL; } echo PHP_EOL; }