У меня есть сервер Selenium, работающий с PHPUnit на локальном сервере MAMP.
Когда Assert завершится сбой, строка с неудачным номером не отображается, вместо этого я вижу цифровую строку phpunit.
Когда я выполняю тест «только для phpunit», я вижу цифровую строку неудавшегося утверждения.
Тест только PHPUnit
$ cd '/Applications/MAMP/htdocs/my-client/tests' && phpunit -c 'phpunit.xml' '/Applications/MAMP/htdocs/my-client/tests/controllers/homeTest.php' PHPUnit 3.6.10 by Sebastian Bergmann. Configuration read from /Applications/MAMP/htdocs/my-client/tests/phpunit.xml . Time: 0 seconds, Memory: 8.00Mb There was 1 failure: 1) HomeTest::test_get_sections Failed asserting that Array ( blah, blah, blah ) ) is identical to Array (blah, blah, blah2 ) ). /Applications/MAMP/htdocs/my-client/tests/controllers/homeTest.php:56 /Applications/MAMP/bin/php/php5.3.6/bin/phpunit:46 FAILURES! Tests: 2, Assertions: 3, Failures: 1.
Тест PHPUnit Selenium
$ cd '/Applications/MAMP/htdocs/my-client/tests' && phpunit -c 'phpunit.xml' '/Applications/MAMP/htdocs/my-client/tests/views/af_web_Test.php' PHPUnit 3.6.10 by Sebastian Bergmann. Configuration read from /Applications/MAMP/htdocs/my-client/tests/phpunit.xml E Time: 2 seconds, Memory: 8.75Mb There was 1 error: 1) af_web_Test::test_crear_una_af_nueva_y_validar_el_valor_por_defecto_de_los_campos Current URL: http://localhost:8888/my-client/index.php/home/view Failed asserting that '' matches PCRE pattern "/0/". /Applications/MAMP/bin/php/php5.3.6/bin/phpunit:46 FAILURES! Tests: 1, Assertions: 6, Errors: 1.
У меня была такая же проблема (хотя и на сервере LAMP), так как я вполне полагаюсь на эти номера строк вместе со скриншотами, чтобы точно выяснить, что происходит в моих тестах. Сообщается, что ошибка, которая, как я предполагаю, является такой. См. https://github.com/sebastianbergmann/phpunit-selenium/issues/81 для справки.
В качестве временного обходного пути я ввел номер строки в сообщение об ошибке в исключающем случае (потому что номер строки можно, конечно, найти в трассировке). В качестве побочного эффекта большинство исключений перезаписываются, и я просто бросаю PHPUnit_Framework_Error, но, по крайней мере, я получаю номер строки на выходе. Как временное обходное решение, пока это не будет исправлено, это работает для меня.
Для этого я расширяю PHPUnit_Extensions_SeleniumTestCase с помощью собственной SeleniumTestCase и вставляю в нее следующие функции:
Очень немного измененная версия этой функции для моего собственного использования: https://stackoverflow.com/a/6608751
protected function dumpStack(Exception $e) { $stack = ''; foreach ($e->getTrace() as $trace) { if (isset($trace['file']) && isset($trace['line']) && isset($trace['class']) && isset($trace['function'])) { $stack .= PHP_EOL . $trace['file'] . ':' . $trace['line'] . ' ' . $trace['class'] . '::' . $trace['function']; } } return $stack; }
Я переопределяю onNotSuccessfulTest из PHPUnit_Extensions_SeleniumTestCase :
protected function onNotSuccessfulTest(Exception $e) { try { parent::onNotSuccessfulTest($e); } catch (PHPUnit_Framework_IncompleteTestError $e) { // Don't do anything with the incomplete test exception throw $e; } catch (PHPUnit_Framework_SkippedTestError $e) { // Don't do anything with the skipped test exception throw $e; } catch (Exception $e_parent) { // Include line number for specific test file in error $error_msg = chr(10).chr(10).$this->dumpStack($e); throw new PHPUnit_Framework_Error($e_parent->getMessage().$error_msg, $e_parent->getCode(), $e_parent->getFile(), $e_parent->getLine(), $e_parent->getTrace()); } }
Мне не нравится этот хак, поэтому, если у кого-то есть лучшее решение, я был бы рад услышать его!
ОБНОВЛЕНИЕ: Я забыл упомянуть об этом изначально: вы, конечно, должны сделать тесты, чтобы расширить свой собственный SeleniumTestCase, а не PHPUnit_Extensions_SeleniumTestCase.