【问题标题】:CakePHP Unit Testing too verbose when using logging使用日志记录时,CakePHP 单元测试过于冗长
【发布时间】:2013-09-17 04:00:39
【问题描述】:

在 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

感谢任何帮助! :)

【问题讨论】:

  • 你找到解决方案了吗?我们对 CLI 中的确切日志消息感到恼火。

标签: php unit-testing cakephp phpunit


【解决方案1】:

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

  1. 您使用$this->assertTrue(true) 只是为了断言。
  2. 您测试过的函数会进行一些日志记录,但未经过测试。
  3. 您的测试运行充满了日志输出。

让我们首先解决第三点:无论您使用什么记录器,它都应该能够被配置为将日志消息放在某个地方。目前看来,记录器只是回显消息。您可能还可以登录文件或发送邮件。或者什么都不做。因此,理论上您应该能够通过仅为测试应用配置来使日志输出静音。

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

日志记录实际上有多种形式,其中一种是帮助开发人员在出现错误时调试应用程序,另一种是为非常重要的应用程序事务留下审计线索。审计跟踪日志是类行为的重要组成部分,必须对其进行测试,而调试辅助只是类的一个插件,即使不发生也不会损害应用程序。

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

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

如果您在测试期间实际注入了该记录器模拟,则为该模拟配置的断言充当测试,我的第一点实际上是无效的,因为现在您有测试断言,但它们不断言返回值 (此示例中没有),而是正确调用内部对象。

另一方面,如果您没有将记录器用于重要的事情,那么就没有必要模拟和测试它。在这种情况下,代码示例很糟糕,因为你真的没有什么可以测试的。这应该让您想知道该功能 testing() 是否真的值得在那里。 :)

假设一个真正的函数会做一些除了日志记录之外的其他事情,但是应该有一些可以测试的东西。加上通过配置使记录器静音,您最终应该会得到一个非常干净的测试输出。

【讨论】:

  • 答案有点矫枉过正,但绝对能引导我找到正确的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多