每个功能文件分叉一个 JVM 进程?

Forking a JVM process per feature file?

我的黄瓜场景测试套件中有许多功能文件。

我 运行 通过使用 CLI 启动 Cucumber 进行测试。

这些是在测试过程 运行ning:

时发生的步骤

虽然测试顺利通过,但问题是默认情况下测试套件花费的时间太长 运行。所以我正在寻找一种增加并行度以加快速度的方法。

在我看来,有不同的并行选项可供选择:

  1. 每个场景都会启动自己的 spring 应用程序上下文(本质上是分叉 JVM),部署自己的容器,然后 运行 以这种方式进行测试。
  2. 每个功能文件都会启动自己的 spring 应用程序上下文(本质上是分叉一个 JVM),部署自己的容器,并 运行 连续地对每个场景进行设置(就像通常那样)。

我认为在理想情况下我们会选择 1(见 *)。但这需要一台具有大量内存和 CPU 的机器(我无权访问)。所以选项 2 可能对我来说最有意义。

我的问题是:

* 独立部署和测试每个场景与 cucumber 文档一致,其中指出:“每个场景都应该是独立的;您应该能够 运行 它们以任何顺序或并行进行,而没有一个场景干扰另一个。每个场景都应该只测试一件事,这样当它失败时,它会因为一个明确的原因而失败。这意味着你不会在另一个场景中重用一个场景。“

这不是真正的堆栈溢出问题。没有一个正确的答案 - 主要取决于。您以后可能想 https://softwareengineering.stackexchange.com/ 试试。

没有。这不可能。 Cucumber 不支持分叉 JVM。然而,Surefire 确实支持分叉,您可以通过为每个功能文件创建一个运行器来利用它。

不过,我会重新考虑测试策略,也可能会重新考虑应用程序设计。 要并行执行测试,您的系统必须支持并行调用。因此,我不会考虑为每次测试重置数据库和事件存储是一个好习惯。 相反,请考虑以每个测试都使用其自己的隔离资源集的方式编写测试。因此,例如,如果您正在测试用户,则可以为每个测试创建随机用户。如果这些用户是组织的一部分,您可以创建一个随机组织等。 这并不总是可能的。某些应用程序在代码中设计了隐式单例资源。在这种情况下,您将不得不重构应用程序以使这些资源显式化。

或者考虑将您的 Cucumber 测试下推到堆栈中。您可以在任何抽象级别测试业务逻辑。它不一定是集成测试。然后,您可以将 JUnit 与 Surefire 结合使用,并使用 Surefire 创建多个分支。