【问题标题】:PHPUnit: force display of asserted valuesPHPUnit:强制显示断言值
【发布时间】:2011-01-28 15:01:31
【问题描述】:

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

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

【问题讨论】:

  • 这是一个不寻常的请求。大多数人都不想这样做。出于这个原因,PHPUnit 不会实现这样的功能。你必须自己做。
  • 不相关的问题,但你为什么需要那个? “通常”,您不应该在测试期间产生输出,因为目的是自动执行(如果一切顺利,人类不应该读取输出)
  • 有时最好输出一些东西,而不是“无”,以显示实际值。 ‘你看不见吗?它有效!'、'我什么都没看到……'。
  • 那么“echo”和“var_dump”你们是不是朋友? (也许你想显示所有断言)

标签: php unit-testing phpunit


【解决方案1】:

运行

phpunit --testdox

将显示每个测试名称。因此,作为一种解决方法,您可以将您的预期和实际断言结果合并到测试名称中......但这只是一种解决方法......

【讨论】:

    【解决方案2】:

    由于您很可能使用 $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() 可能还不够你喜欢的晚。这与断言失败不同。

    【讨论】:

    • 是的,我也想过这个,但是我还没有找到所有断言的任何基本方法。
    • 哦!我知道了。但我确实想知道:(如果它存在的话)这是否明智?不同的断言有不同的语义和不同的参数。不会试图将它们全部归结为一种不会削弱(或更糟)您想要的反馈的有效性的方法吗?
    • 我想要的唯一明智的选择是命令行开关。如果这会更麻烦,还有一个实现。
    【解决方案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】:

      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 Tab 中看到输出。

      另一条路线是TestListeners,但我对它们了解不多,无法告诉你任何细节。看起来你可以加入测试过程。

      【讨论】:

      • 要完成这个,我可能只是修改PHPUnit_Assert,但我希望一些命令行开关能够按需提供此功能......
      • @takehin 修改核心库总是是个坏主意。下次你更新 PHPUnit 时,你所有的模组都消失了。这就是为什么我建议改为扩展或使用自定义断言。
      • 你说得对,戈登。但这只是一个假设的想法。我不打算重写 PHPUnit 也不打算到处放 var_dumps,只是当我想看看调试的时候 :)
      【解决方案5】:

      您实际上可以只在断言中使用 $message 值???方法并将您想要的任何内容放在该字段中。我通常使用它来显示预期值和实际值以及断言的唯一名称(假设我在给定测试中有多个)。

      【讨论】:

        【解决方案6】:

        另一件事可能是编写自己的监听器。这样,您可以提供所需的输出并将断言留给 phpunit。我猜这可能是最简单和最可定制的方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-02
          • 2016-09-14
          • 2020-02-16
          • 2013-09-09
          • 2012-03-08
          • 1970-01-01
          • 2020-10-26
          • 2018-11-27
          相关资源
          最近更新 更多