我有一个包含大量测试的java项目。我的构建使用Gradle,测试使用TestNG并由gradle调用。我想通过在多个worker上同时运行我的构建并让每个worker只运行一部分测试来加快测试构建。
每个节点将提供2个环境变量TOTAL_NODES
和NODE_NUMBER
,其中TOTAL_NODES
是运行构建的节点数,NODE_NUMBER
是分配给此特定节点的数量
我想要一种分区测试的方法,以便每个节点运行~1 / TOTAL_NODES测试,每个测试只运行一次。使用gradle和TestNG有一种简单的方法吗?
我可以通过标记特定组中的每一个来手动将测试划分为偶数组,但是有许多测试,这是一个主要的维护麻烦,而且如果节点数量发生变化,它也不会扩展。
Gradle提供了测试过滤功能,但它似乎都基于类名匹配,并且不能接受任意过滤功能。我可以找到所有测试文件,然后根据一些散列方案对它们进行细分,然后再将它们插入测试过滤器,但它似乎不必要地复杂。
有更简单的方法吗?
答案 0 :(得分:1)
Gradle或TestNG可能没有简单的方法,但您可以实现Listener org.testng.IMethodInterceptor
并在其中实现分割算法。
org.testng.IMethodInterceptor#intercept
,您将获得所有计划运行的测试实例。因此,如果您阅读ENV变量,然后根据TOTAL_NODES
将所有实例吐出到某些类别,则只能返回与NODE_NUMBER
匹配的类别,例如使用HashMap
,其中键为NODE_NUMBER
,值为List<IMethodInstance>
,结尾为intercept()
,返回map.get(NODE_NUMBER)
http://testng.org/doc/documentation-main.html#methodinterceptors