在PHPUnit测试失败时,显示实际值和期望值 但是当测试通过时,不会显示此信息。
如何强制PHPUnit始终显示预期和实际的断言结果?
答案 0 :(得分:12)
正在运行
phpunit --testdox
将显示每个测试名称。因此,作为一种解决方法,您可以在测试名称中包含您的预期和实际断言结果......仍然只是一种解决方法......
答案 1 :(得分:3)
由于您最有可能使用 $ this->断言...()调用断言,因此您可以在测试用例中覆盖这些方法。快速举例:
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 :(得分: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')'.
.
除非测试失败,否则它不会告诉您测试函数的实际结果,但至少可以看到所有断言的值。
答案 3 :(得分:2)
要么create your own Assertion class,要使其行为像实际断言类的代理,并在委托给实际断言之前回显值,例如
$this->assertWithLogging('assertion', $expected, $actual, $message);
或覆盖PHPUnit自己的类(我认为这将非常棘手)或只是做
$this->assertSame($expected, $actual, $message);
echo "$expected is $actual";
这也不是很好,因为它会在通过CLI运行时搞砸输出。如果您碰巧使用Zend Studio,您将在Debug Output选项卡中看到输出。
另一条路线是TestListeners,但我不太了解他们告诉你任何细节。看起来你可以参与测试过程。
答案 4 :(得分:0)
你实际上只需在断言中使用$ message值???方法,并把你想要的东西放在那个领域。我通常用它来显示预期值和实际值以及断言的唯一名称(假设我在给定的测试中有多个)。
答案 5 :(得分:0)
另一件事可能是编写自己的监听器。这样,您可以提供所需的输出并将断言留给phpunit。这可能是最简单,最可定制的方式,我猜。