PHPUnit:强制显示断言值

时间:2010-03-17 14:53:39

标签: php unit-testing phpunit

在PHPUnit测试失败时,显示实际值和期望值 但是当测试通过时,不会显示此信息。

如何强制PHPUnit始终显示预期和实际的断言结果?

6 个答案:

答案 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。这可能是最简单,最可定制的方式,我猜。