如何让测试在 Scalatest 中始终以相同的顺序运行?

Posted

技术标签:

【中文标题】如何让测试在 Scalatest 中始终以相同的顺序运行?【英文标题】:How make tests always run in same order in Scalatest? 【发布时间】:2012-06-30 18:53:11 【问题描述】:

我们在 ScalaTest 中使用 Spec trait 进行测试。当我们运行整个套件时,它并不总是以相同的顺序运行。谷歌中的大多数答案都建议定义一个套件并指定所有测试名称。但这需要我们在每次添加新测试时添加测试名称。

是否可以使用 DiscoverySuite 本身并定义测试执行顺序?就像按字母顺序运行测试一样。我查看了扩展 DiscoverySuite,但 DiscoverySuite 似乎对 scalatest 是私有的。

---更多信息----

我的意思是,如果有测试 A、B、C。

A 类扩展规范 .. B 类扩展规范 .. C 类扩展规范 ..

然后我希望测试按顺序运行(A、B、C)。但现在发生的是,它每次都以不同的顺序运行。

【问题讨论】:

FWIW,测试应该被定义为执行顺序无关紧要。这使得单个测试更具弹性(更改测试 A 不会破坏测试 B)、更易于理解(要理解测试 A,我只需要查看测试 A)和独立(我可以只运行我需要的测试)。 我理解并完全同意应该定义测试,以便顺序无关紧要。但不幸的是,这些都是功能性(Webdriver)测试,而且数量很多。因此,作为修复它们的第一步,我想让它们以相同的顺序运行,同时分析问题所在。 【参考方案1】:

DiscoverySuite 是 ScalaTest 私有的,是的。 Spec(顺便说一下,现在称为 FunSpec)中测试的执行顺序被定义为源文件中出现的顺序。要定义测试类本身的顺序,您将需要定义一个 nestedSuites 方法并运行该包装器套件而不是使用 Discovery。一旦不再需要订单,您就可以重新使用发现功能。我将着眼于在下一个 ScalaTest 版本中向 DiscoverySuite 添加定义的顺序。

【讨论】:

如上所述,我希望测试按字母顺序运行,这样如果测试失败,我可以再次重现它。目前,我们有很多原因导致测试失败。只是想从等式中取出测试顺序并分析其他故障。一旦其他原因减少,我们将取消排序。 与此类似,我发现测试的继承模型可能是有益的。目前,我的测试 B 失败了,但在它运行之前,正在测试测试 C(使用 B),显然失败了。我可以声明只有在 B 通过时才应该运行 C 吗?【参考方案2】:

见http://doc.scalatest.org/1.0/org/scalatest/SequentialNestedSuiteExecution.html

这似乎提供了您正在寻找的特定行为。

【讨论】:

以上是关于如何让测试在 Scalatest 中始终以相同的顺序运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单线程中运行 ScalaTest 套件?

用 ScalaTest 比较集合内容

如何在 ScalaTest / SBT 中按顺序运行测试套件?

如何使用 scalatest 运行 sbt 测试?我有一个错误:对象 scalatest 不是包 org 的成员

如何在ScalaTest中按顺序运行类中的测试?

在所有 Scalatest 测试之前或之后做某事