PHPUnit: принудительное отображение утвержденных значений

При неудачном выполнении теста PHPUnit отображаются фактические и ожидаемые значения.
Но когда тест проходит, эта информация не отображается.

Как заставить PHPUnit всегда отображать ожидаемый и фактический результат утверждения?

Ответ 1

Поскольку вы, скорее всего, вызываете утверждения с помощью $this- > assert...(), вы можете просто перезаписать эти методы в тестовом примере. Быстрый пример:

class YourTestCase extends PHPUnit_Framework_TestCase {
    ...
    static private $messages = array();
    ...
    static public function assertSame($var1, $var2, $message = '') {
        parent::assertSame($var1, $var2, $message);
        // assertSame() throws an exception if not true, so the following
        // won't occur unless the messages actually are the same
        $success = print_r($var1, true) . ' is the same as '
                 . print_r($var2, true);
        self::$messages = array_merge(self::$messages, array($success));
    }

    static public function tearDownAfterClass() {
        echo implode("\n", self::$messages);
    }
}

Конечно, tearDownAfterClass() может быть недостаточно поздно для вас. Это не то же самое, что и ошибка утверждения.

Ответ 2

работает

phpunit --testdox

покажет каждое тестовое имя. Итак, как обходной путь, вы могли бы включить ваши ожидаемые и фактические результаты утверждения внутри имени теста... все же это всего лишь обходной путь...

Ответ 3

Я пришел в это сообщение, ища что-то подобное. У меня есть этот тестовый файл:

/**
 * test routing logic (numbers method returns an array of numbers and expected outputs to test)
 * @dataProvider numbers
 */
function testRoute($input,$expected)
{
   $route = new Route($input,'',false);
   $route->route();
   $this->assertEquals($expected,$route->routingResult);
}

и мой метод чисел:

/**
 * read pairs of numbers (input <tab> expected) from tests.input separater by tab
 * return an array like this: array(array(number1,expected1), array(number2,expected2), ...)
 * provide this array to my tests by returning it
 */
function numbers()
{
    $testcases = file('tests.input');
    $tests = array();
    foreach($testcases as $test_case)
    {
        list($input,$output) = explode("\t",$test_case,2);
        $tests[] = array(trim($input),trim($output));
    }
    return $tests;
}

Что происходит, вы получаете такой вывод из phpunit:

 Starting test 'RouteTest::testRoute with data set #0 ('8596000000', 'rejected (dp not found)x')'.
 F
 Starting test 'RouteTest::testRoute with data set #1 ('8596000001', 'rejected (rejected by scheme)')'.
 .
 Starting test 'RouteTest::testRoute with data set #2 ('8596000003', '1599000003')'.
 .

Он не скажет вам фактический результат тестируемой функции, если тест не сработает, но по крайней мере вы увидите все утверждённые значения.

Ответ 4

Либо создайте свой собственный класс Assertion, и пусть он ведет себя как прокси-сервер к фактическому классу утверждения и повторяет значения перед передачей фактическому утверждение, например

$this->assertWithLogging('assertion', $expected, $actual, $message);

или переопределить собственный класс PHPUnit (который, я думаю, будет очень сложным) или просто выполните

$this->assertSame($expected, $actual, $message);
echo "$expected is $actual";

Это тоже не очень хорошо, потому что он будет прикручивать вывод при запуске через CLI. Если вы используете Zend Studio, вы увидите вывод на вкладке Debug Output.

Другой маршрут будет с TestListeners, но я не знаю достаточно о них, чтобы сообщить вам какие-либо подробности. Похоже, вы можете подключиться к процессу тестирования.

Ответ 5

На самом деле вы можете просто использовать значение $message в assert??? метод и поставить то, что вы хотите в этой области. Обычно я использую его для отображения ожидаемых и фактических значений, а также уникального имени для утверждения (предполагая, что у меня более одного в данном тесте).

Ответ 6

Еще одна вещь может заключаться в том, чтобы написать собственного слушателя. Таким образом, вы можете предоставить нужный результат и оставить утверждения в phpunit. Это может быть самый простой и настраиваемый способ сделать это, я думаю.