【问题标题】:Partitioning tests across multiple nodes with Gradle and TestNG使用 Gradle 和 TestNG 跨多个节点对测试进行分区
【发布时间】:2015-05-13 20:37:33
【问题描述】:

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

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

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

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

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

有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: java testing gradle continuous-integration testng


    【解决方案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

    【讨论】:

    • 谢谢!这听起来正是我需要的。我试图找出一个有用的 gradle 预测试钩子,但我没想过要查看 testNG 本身。我会试一试并报告。
    • 这似乎是要走的路,但我遇到了一个我不明白的错误。当我使用 IMethodIntercepter 过滤测试时,我得到了 NPE。我在这里开了一张票github.com/cbeust/testng/issues/690
    • 是的,看起来像某些工具中的错误。您是否尝试使用最新的 Gradle/TestNG 版本或另一方面一些旧版本?事实上,我之前实现了类似的解决方案,它对我有用,所以问题可能在于 Gradle - TestNG 之间的(内部)集成(可能取决于版本)。
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多