При неудачном выполнении теста PHPUnit отображаются фактические и ожидаемые значения.
Но когда тест проходит, эта информация не отображается.
Как заставить PHPUnit всегда отображать ожидаемый и фактический результат утверждения?
При неудачном выполнении теста PHPUnit отображаются фактические и ожидаемые значения.
Но когда тест проходит, эта информация не отображается.
Как заставить PHPUnit всегда отображать ожидаемый и фактический результат утверждения?
Поскольку вы, скорее всего, вызываете утверждения с помощью $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() может быть недостаточно поздно для вас. Это не то же самое, что и ошибка утверждения.
работает
phpunit --testdox
покажет каждое тестовое имя. Итак, как обходной путь, вы могли бы включить ваши ожидаемые и фактические результаты утверждения внутри имени теста... все же это всего лишь обходной путь...
Я пришел в это сообщение, ища что-то подобное. У меня есть этот тестовый файл:
/**
* 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')'.
.
Он не скажет вам фактический результат тестируемой функции, если тест не сработает, но по крайней мере вы увидите все утверждённые значения.
Либо создайте свой собственный класс Assertion, и пусть он ведет себя как прокси-сервер к фактическому классу утверждения и повторяет значения перед передачей фактическому утверждение, например
$this->assertWithLogging('assertion', $expected, $actual, $message);
или переопределить собственный класс PHPUnit (который, я думаю, будет очень сложным) или просто выполните
$this->assertSame($expected, $actual, $message);
echo "$expected is $actual";
Это тоже не очень хорошо, потому что он будет прикручивать вывод при запуске через CLI. Если вы используете Zend Studio, вы увидите вывод на вкладке Debug Output.
Другой маршрут будет с TestListeners, но я не знаю достаточно о них, чтобы сообщить вам какие-либо подробности. Похоже, вы можете подключиться к процессу тестирования.
На самом деле вы можете просто использовать значение $message в assert??? метод и поставить то, что вы хотите в этой области. Обычно я использую его для отображения ожидаемых и фактических значений, а также уникального имени для утверждения (предполагая, что у меня более одного в данном тесте).
Еще одна вещь может заключаться в том, чтобы написать собственного слушателя. Таким образом, вы можете предоставить нужный результат и оставить утверждения в phpunit. Это может быть самый простой и настраиваемый способ сделать это, я думаю.