使用 Gradle 和 TestNG 跨多个节点进行分区测试

Partitioning tests across multiple nodes with Gradle and TestNG

我有一个包含大量测试的 java 项目。我的构建使用 Gradle,测试使用 TestNG 并由 gradle 调用。我想通过 运行 同时在多个工作人员上构建我的构建并让每个工作人员 运行 只是测试的一个子集来加速测试构建。

每个节点将提供 2 个环境变量 TOTAL_NODESNODE_NUMBER,其中 TOTAL_NODES 是 运行 我构建的节点数, NODE_NUMBER 是分配给该特定节点的编号。

我想要一种划分测试的方法,以便每个节点 运行s ~ 1/TOTAL_NODES 测试并且每个测试恰好 运行 一次。有没有使用 gradle 和 TestNG 的简单方法?

我可以通过在特定组中标记每个测试来手动将测试分成偶数组,但是有很多测试,这是一个主要的维护麻烦,而且如果节点数量发生变化,它也不会扩展。

Gradle提供测试过滤,但好像都是class名字匹配,不能接受任意过滤功能。我可以找到所有的测试文件,然后在将它们插入测试过滤器之前根据某种散列方案将它们细分,但这似乎不必要地复杂。

有更简单的方法吗?

Gradle 或 TestNG 可能没有提供简单的方法,但您可以实现 Listener org.testng.IMethodInterceptor 并在其中实现拆分算法。

org.testng.IMethodInterceptor#intercept 在测试套件启动之前被调用,您将获得计划用于 运行 的所有测试实例。因此,如果您读取 ENV 变量,然后根据 TOTAL_NODES 将所有实例吐到某些类别,您可以 return 仅匹配 NODE_NUMBER 的类别,例如使用 HashMap,其中键是 NODE_NUMBER,值是 List<IMethodInstance> 最后 intercept() returns map.get(NODE_NUMBER)

http://testng.org/doc/documentation-main.html#methodinterceptors