CakePHP单元测试在使用日志记录时过于冗长

时间:2013-09-12 16:39:06

标签: php unit-testing cakephp phpunit

在CakePHP中,我有一个非常简单的测试,但每当我在我的模型中使用$ this-> log()时,即使我的测试正在通过,我在运行测试时也会在CLI中获得非常讨厌的输出。这使得当存在真正的错误时调试变得更加困难,我必须尝试过滤掉日志输出以找出真正的错误。

示例:

//单元测试

public function testTesting() {
    $this->Ad->testing();
    $this->assertTrue(true);
}

//正在测试的模型方法

public function testing() {
    $this->log('sweet nothings');
}

CLI中的输出:http://cl.ly/image/3R3a040c3S46

正如您可以看到我的测试通过,但我得到了日志的详细输出。我使用的命令是cake test app Model/ModelName

如何使CLI运行器的输出不那么冗长。使用-q或--quiet会收到错误unrecognized option --quiet

任何帮助表示赞赏! :)

1 个答案:

答案 0 :(得分:1)

您的最小测试用例很好地说明了一些方面:

  1. 您只是为了断言而使用$this->assertTrue(true)
  2. 您测试的功能会进行一些记录,但未经过测试。
  3. 您的测试运行中充满了日志输出。
  4. 让我们先解决第三点:无论你使用什么记录器,它都应该能够配置为将日志消息放在某处。目前看来,记录器只是回应了消息。您可能还可以登录文件或发送邮件。或者什么都不做。因此理论上,您应该能够通过仅为测试应用配置来使日志输出静音。

    第二点:无论何时使记录器输出静音,都无法验证记录是否真正正常工作。

    日志记录实际上有多种风格,其中一种是帮助开发人员在发生错误时调试应用程序,另一种是为非常重要的应用程序事务留下审计跟踪。审计跟踪日志记录是类的行为的重要组成部分,必须进行测试,而调试辅助工具只是类的一个插件,如果没有发生,它将不会对应用程序造成伤害。

    所以问题是:这个日志记录在你的应用程序中做了什么?它只是一个调试辅助工具,还是应用程序行为的重要组成部分?

    如果它至关重要,则必须进行测试。并且最好通过注入记录器的模拟对象来完成测试,并且可以使用正确的参数断言对log()函数的调用。

    如果你在测试期间实际注入了logger mock,那个模拟的配置断言就作为测试,我的第一点实际上是无效的,因为现在你已经测试了断言,但它们没有断言返回值(在这个例子中没有,但正确调用内部对象。

    另一方面,如果您没有使用记录器来处理重要的事情,那么就没有必要进行模拟和测试。在这种情况下,代码示例很糟糕,因为你真的没有什么可以测试的。哪个应该让你想知道这个函数testing()是否真的值得存在。 :)

    假设一个真正的函数除了记录之外还会执行其他一些操作,但应该可以测试一些东西。通过配置使记录器静音,您应该最终获得非常干净的测试输出。