Селен не показывает ошибочные номера строк - PullRequest
4 голосов
/ 10 февраля 2012

Сервер Selenium работает с PHPUnit на локальном сервере MAMP.

При сбое Assert строка с ошибочным номером не отображается, вместо этого отображается строка с номером phpunit.

Когда я выполняю тест "phpunit only", я вижу номерную строку неудачного утверждения.

PHPUnit only test

$ 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 test

$ 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.

1 Ответ

4 голосов
/ 28 февраля 2012

У меня была такая же проблема (хотя и на сервере 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());
     }
}

Мне не нравится этот взлом, поэтому, если у кого-то есть лучшее решение, я буду рад его услышать!

UPDATE: Первоначально я забыл упомянуть об этом: вы, конечно, должны заставить тесты расширять свой собственный SeleniumTestCase, а не PHPUnit_Extensions_SeleniumTestCase.

...