PageRenderTime 59ms CodeModel.GetById 32ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Codeception/PHPUnit/Runner.php

https://github.com/pmcjury/Codeception
PHP | 150 lines | 112 code | 28 blank | 10 comment | 11 complexity | 08d1ddc237ae798c5ae932200456e515 MD5 | raw file
  1. <?php
  2. namespace Codeception\PHPUnit;
  3. use Codeception\Configuration;
  4. use Codeception\PHPUnit\Log\JUnit;
  5. use Codeception\PHPUnit\ResultPrinter\HTML;
  6. use Codeception\PHPUnit\ResultPrinter\Report;
  7. class Runner extends \PHPUnit_TextUI_TestRunner
  8. {
  9. public static $persistentListeners = array();
  10. protected $defaultListeners = array(
  11. 'xml' => false,
  12. 'html' => false,
  13. 'tap' => false,
  14. 'json' => false
  15. );
  16. protected $config = array();
  17. protected $logDir = null;
  18. protected $defaultArguments = array(
  19. 'report' => false,
  20. );
  21. public function __construct()
  22. {
  23. $this->config = Configuration::config();
  24. $this->logDir = Configuration::outputDir(); // prepare log dir
  25. $this->phpUnitOverriders();
  26. parent::__construct();
  27. }
  28. public function phpUnitOverriders()
  29. {
  30. require_once __DIR__ . DIRECTORY_SEPARATOR . 'Overrides/Filter.php';
  31. }
  32. /**
  33. * @return null|\PHPUnit_TextUI_ResultPrinter
  34. */
  35. public function getPrinter()
  36. {
  37. return $this->printer;
  38. }
  39. public function doEnhancedRun(
  40. \PHPUnit_Framework_Test $suite,
  41. \PHPUnit_Framework_TestResult $result,
  42. array $arguments = array()
  43. ) {
  44. unset($GLOBALS['app']); // hook for not to serialize globals
  45. $arguments = array_merge($this->defaultArguments, $arguments);
  46. $this->handleConfiguration($arguments);
  47. $result->convertErrorsToExceptions(false);
  48. if ($arguments['report']) {
  49. $this->printer = new Report();
  50. }
  51. if (empty(self::$persistentListeners)) {
  52. $this->applyReporters($result, $arguments);
  53. }
  54. $arguments['listeners'][] = $this->printer;
  55. // clean up listeners between suites
  56. foreach ($arguments['listeners'] as $listener) {
  57. $result->addListener($listener);
  58. }
  59. $filterFactory = new \PHPUnit_Runner_Filter_Factory();
  60. if ($arguments['groups']) {
  61. $filterFactory->addFilter(
  62. new \ReflectionClass('PHPUnit_Runner_Filter_Group_Include'),
  63. $arguments['groups']
  64. );
  65. }
  66. if ($arguments['excludeGroups']) {
  67. $filterFactory->addFilter(
  68. new \ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'),
  69. $arguments['excludeGroups']
  70. );
  71. }
  72. if ($arguments['filter']) {
  73. $filterFactory->addFilter(
  74. new \ReflectionClass('PHPUnit_Runner_Filter_Test'),
  75. $arguments['filter']
  76. );
  77. }
  78. $suite->injectFilter($filterFactory);
  79. $suite->run($result);
  80. unset($suite);
  81. foreach ($arguments['listeners'] as $listener) {
  82. $result->removeListener($listener);
  83. }
  84. return $result;
  85. }
  86. /**
  87. * @param \PHPUnit_Framework_TestResult $result
  88. * @param array $arguments
  89. *
  90. * @return array
  91. */
  92. protected function applyReporters(\PHPUnit_Framework_TestResult $result, array $arguments)
  93. {
  94. foreach ($this->defaultListeners as $listener => $value) {
  95. if (! isset($arguments[$listener])) {
  96. $arguments[$listener] = $value;
  97. }
  98. }
  99. if ($arguments['html']) {
  100. self::$persistentListeners[] = new HTML($this->absolutePath($arguments['html']));
  101. }
  102. if ($arguments['xml']) {
  103. self::$persistentListeners[] = new JUnit($this->absolutePath($arguments['xml']), true);
  104. }
  105. if ($arguments['tap']) {
  106. self::$persistentListeners[] = new \PHPUnit_Util_Log_TAP($this->absolutePath($arguments['tap']));
  107. }
  108. if ($arguments['json']) {
  109. self::$persistentListeners[] = new \PHPUnit_Util_Log_JSON($this->absolutePath($arguments['json']));
  110. }
  111. foreach (self::$persistentListeners as $listener) {
  112. $result->addListener($listener);
  113. }
  114. }
  115. private function absolutePath($path)
  116. {
  117. if ((strpos($path, '/') === 0) or (strpos($path, ':') === 1)) { // absolute path
  118. return $path;
  119. }
  120. return $this->logDir . $path;
  121. }
  122. }