如何强制 PHPUnit 在跳过的测试中失败?

Posted

技术标签:

【中文标题】如何强制 PHPUnit 在跳过的测试中失败?【英文标题】:How to force PHPUnit to fail on skipped tests? 【发布时间】:2019-01-21 10:12:49 【问题描述】:

我正在尝试使用 phpUnit 和 Selenium 和 headless firefox 设置自动化测试。当 Travis CI 尝试运行我的测试时,Selenium 服务器无法启动,但我的测试被认为是 OK,因为 PHPUnit 将其标记为已跳过:

The Selenium Server is not active on host localhost at port 4444.
OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Skipped: 1.
The command "make test" exited with 0.

在我看来,当内部错误甚至无法启动时,测试应该被视为失败。这真的很愚蠢,因为我的测试可能会以这种方式失败,如果没有阅读完整的报告,我可以相信一切都运行正常,因为 Travis CI 认为返回值 0 是成功的测试。

当有跳过的测试时,是否有一个选项可以让 PHPUnit 返回非零结果?或者甚至让它直接将测试报告为 Selenium 错误失败?

【问题讨论】:

您的phpunit.xml.dist 看起来如何? (phpunit.de/manual/6.5/en/appendixes.configuration.html) 我没有使用任何。是否有一个选项会触发我请求的行为? 对不起,我离线了,但你得到了答案 :) 【参考方案1】:

考虑在您的phpunit.xml 文件中配置以下参数。

     stopOnError="true"
     stopOnFailure="true"
     stopOnIncomplete="true"
     stopOnSkipped="true"
     stopOnRisky="true"

Reference

如果你想使用命令行 args 等价物是:

  --stop-on-error             Stop execution upon first error.
  --stop-on-failure           Stop execution upon first error or failure.
  --stop-on-warning           Stop execution upon first warning.
  --stop-on-risky             Stop execution upon first risky test.
  --stop-on-skipped           Stop execution upon first skipped test.
  --stop-on-incomplete        Stop execution upon first incomplete test.

对于您的情况,您希望在跳过时停止

旁注要使测试被视为FAILED,必须存在失败的断言。由于跳过的测试实际上并未执行,因此您不能将它们视为失败,您应该依赖执行摘要并确保没有发生风险或跳过的测试。

如果您希望将风险测试和警告测试视为失败测试,您可以使用以下参数:

  --fail-on-warning           Treat tests with warnings as failures.
  --fail-on-risky             Treat risky tests as failures.

Reference

如果出于任何原因您想让 PHPUnit 返回 0 以外的退出代码(成功),请考虑查看 How to make PHPunit return nonzero exit status on warnings

【讨论】:

谢谢。停止并不是我想要的(想将测试标记为失败),但我可以忍受。我想知道有多少次有错误的代码仅仅因为这个愚蠢的功能而进入生产环境。 不客气。请注意,要被视为FAILED 的测试必须存在失败的断言。由于跳过的测试并未实际执行,您(phpunit)不能将它们视为失败,您应该依赖(读取或以编程方式解释)执行摘要并确保没有发生风险或跳过的测试。 奇怪。在我看来,这应该恰恰相反——除非有成功的断言,否则测试不应被视为成功。我认为测试是一种防止错误代码进入生产环境的方法,如果你根本不运行测试,你如何防止这种情况发生?当我设计自己的测试框架时,我会牢记这一点;) 所以也许我的回答不完整。我希望--fail-on-risky 能派上用场。另见***.com/questions/38303547/… 非常感谢您的帮助,但是我测试了它并不起作用。我对 PHPUnit 非常失望,尤其是它的作者——在阅读了 GitHub 上的讨论后,事实证明 PHPUnit 的创建者本人强烈主张这种(愚蠢的)行为。似乎没有办法让 PHPUnit 报告测试失败,因此没有人应该在 CI 环境中使用它。【参考方案2】:

经过所有研究,我必须得出结论,即使有跳过的测试,PHPUnit(至少从 7.3 版开始)也会返回 0 并且不能强制执行其他操作任何可用的配置选项。

这意味着当您的测试套件中的测试由于任何原因甚至无法启动时,PHPUnit 仍将返回 0 作为整个测试会话的结果,并且Travis CI 将其视为成功。它将在构建历史记录中显示为绿色,找出发生了什么的唯一方法是打开日志并通读它。这样一来,除非您在部署之前阅读整个构建日志并调查可能存在的问题,否则您可能很容易最终部署带有错误的代码。

如果有人证明我错了,我会删除这个答案。或者当 PHPUnit 作者修复这个问题时。

目前我转向 jUnit

【讨论】:

以上是关于如何强制 PHPUnit 在跳过的测试中失败?的主要内容,如果未能解决你的问题,请参考以下文章

如何表明 PHPUnit 测试预计会失败?

Laravel phpunit 跳过自定义测试文件

如何跳过 PHPunit 中的测试?

如何在phpunit测试中强制将环境变量设置为某个值?

PHPUnit-函数依赖-数据提供-异常-忽略-自动生成

当跳过所有测试时,pytest 总体结果“通过”