每个功能文件分叉一个 JVM 进程?
Forking a JVM process per feature file?
我的黄瓜场景测试套件中有许多功能文件。
我 运行 通过使用 CLI 启动 Cucumber 进行测试。
这些是在测试过程 运行ning:
时发生的步骤
- 我们创建了 class 的
static
实例,它管理我的黄瓜测试的测试容器的生命周期。
- 这目前涉及三个容器:(i) Postgres DB(应用了我们的模式),(ii) Axon Server(事件存储),(iii) 一个单独的应用程序容器。
- 我们使用 spring 的新
@DynamicPropertySource
来设置我们的数据源、事件存储等的值,以便 cucumber 进程可以连接到容器。
@Before
每个场景我们都会对测试容器进行一些清理。
- 这是为了让每个场景都有一个全新的状态。
- 它涉及在表(postgres 容器)中整理数据,重置我们事件存储(Axon 服务器容器)中的所有事件,以及我们应用程序的一些其他工作(重置相关跟踪事件处理器),等等
虽然测试顺利通过,但问题是默认情况下测试套件花费的时间太长 运行。所以我正在寻找一种增加并行度以加快速度的方法。
- 添加参数
--threads <n>
将不起作用,因为 static
容器将处于争用状态(我已经尝试过,但正如预期的那样失败了)。
在我看来,有不同的并行选项可供选择:
- 每个场景都会启动自己的 spring 应用程序上下文(本质上是分叉 JVM),部署自己的容器,然后 运行 以这种方式进行测试。
- 每个功能文件都会启动自己的 spring 应用程序上下文(本质上是分叉一个 JVM),部署自己的容器,并 运行 连续地对每个场景进行设置(就像通常那样)。
我认为在理想情况下我们会选择 1(见 *)。但这需要一台具有大量内存和 CPU 的机器(我无权访问)。所以选项 2 可能对我来说最有意义。
我的问题是:
- 是否可以将 Cucumber 配置为分叉 JVM,其中 运行 分配了功能文件(与上面的选项 2 匹配?)
- 并行化这种情况(使用测试容器)的最佳方法是什么?
* 独立部署和测试每个场景与 cucumber 文档一致,其中指出:“每个场景都应该是独立的;您应该能够 运行 它们以任何顺序或并行进行,而没有一个场景干扰另一个。每个场景都应该只测试一件事,这样当它失败时,它会因为一个明确的原因而失败。这意味着你不会在另一个场景中重用一个场景。“
这不是真正的堆栈溢出问题。没有一个正确的答案 - 主要取决于。您以后可能想 https://softwareengineering.stackexchange.com/ 试试。
没有。这不可能。 Cucumber 不支持分叉 JVM。然而,Surefire 确实支持分叉,您可以通过为每个功能文件创建一个运行器来利用它。
不过,我会重新考虑测试策略,也可能会重新考虑应用程序设计。
要并行执行测试,您的系统必须支持并行调用。因此,我不会考虑为每次测试重置数据库和事件存储是一个好习惯。
相反,请考虑以每个测试都使用其自己的隔离资源集的方式编写测试。因此,例如,如果您正在测试用户,则可以为每个测试创建随机用户。如果这些用户是组织的一部分,您可以创建一个随机组织等。
这并不总是可能的。某些应用程序在代码中设计了隐式单例资源。在这种情况下,您将不得不重构应用程序以使这些资源显式化。
或者考虑将您的 Cucumber 测试下推到堆栈中。您可以在任何抽象级别测试业务逻辑。它不一定是集成测试。然后,您可以将 JUnit 与 Surefire 结合使用,并使用 Surefire 创建多个分支。
我的黄瓜场景测试套件中有许多功能文件。
我 运行 通过使用 CLI 启动 Cucumber 进行测试。
这些是在测试过程 运行ning:
时发生的步骤- 我们创建了 class 的
static
实例,它管理我的黄瓜测试的测试容器的生命周期。- 这目前涉及三个容器:(i) Postgres DB(应用了我们的模式),(ii) Axon Server(事件存储),(iii) 一个单独的应用程序容器。
- 我们使用 spring 的新
@DynamicPropertySource
来设置我们的数据源、事件存储等的值,以便 cucumber 进程可以连接到容器。
@Before
每个场景我们都会对测试容器进行一些清理。- 这是为了让每个场景都有一个全新的状态。
- 它涉及在表(postgres 容器)中整理数据,重置我们事件存储(Axon 服务器容器)中的所有事件,以及我们应用程序的一些其他工作(重置相关跟踪事件处理器),等等
虽然测试顺利通过,但问题是默认情况下测试套件花费的时间太长 运行。所以我正在寻找一种增加并行度以加快速度的方法。
- 添加参数
--threads <n>
将不起作用,因为static
容器将处于争用状态(我已经尝试过,但正如预期的那样失败了)。
在我看来,有不同的并行选项可供选择:
- 每个场景都会启动自己的 spring 应用程序上下文(本质上是分叉 JVM),部署自己的容器,然后 运行 以这种方式进行测试。
- 每个功能文件都会启动自己的 spring 应用程序上下文(本质上是分叉一个 JVM),部署自己的容器,并 运行 连续地对每个场景进行设置(就像通常那样)。
我认为在理想情况下我们会选择 1(见 *)。但这需要一台具有大量内存和 CPU 的机器(我无权访问)。所以选项 2 可能对我来说最有意义。
我的问题是:
- 是否可以将 Cucumber 配置为分叉 JVM,其中 运行 分配了功能文件(与上面的选项 2 匹配?)
- 并行化这种情况(使用测试容器)的最佳方法是什么?
* 独立部署和测试每个场景与 cucumber 文档一致,其中指出:“每个场景都应该是独立的;您应该能够 运行 它们以任何顺序或并行进行,而没有一个场景干扰另一个。每个场景都应该只测试一件事,这样当它失败时,它会因为一个明确的原因而失败。这意味着你不会在另一个场景中重用一个场景。“
这不是真正的堆栈溢出问题。没有一个正确的答案 - 主要取决于。您以后可能想 https://softwareengineering.stackexchange.com/ 试试。
没有。这不可能。 Cucumber 不支持分叉 JVM。然而,Surefire 确实支持分叉,您可以通过为每个功能文件创建一个运行器来利用它。
不过,我会重新考虑测试策略,也可能会重新考虑应用程序设计。 要并行执行测试,您的系统必须支持并行调用。因此,我不会考虑为每次测试重置数据库和事件存储是一个好习惯。 相反,请考虑以每个测试都使用其自己的隔离资源集的方式编写测试。因此,例如,如果您正在测试用户,则可以为每个测试创建随机用户。如果这些用户是组织的一部分,您可以创建一个随机组织等。 这并不总是可能的。某些应用程序在代码中设计了隐式单例资源。在这种情况下,您将不得不重构应用程序以使这些资源显式化。
或者考虑将您的 Cucumber 测试下推到堆栈中。您可以在任何抽象级别测试业务逻辑。它不一定是集成测试。然后,您可以将 JUnit 与 Surefire 结合使用,并使用 Surefire 创建多个分支。