【问题标题】:how to understand the parallel="instances" in testng suite configure?如何理解 testng 套件配置中的 parallel="instances"?
【发布时间】:2013-06-09 19:54:04
【问题描述】:

parallel="instances":

TestNG 将在同一个线程中运行同一个实例中的所有方法,但是两个不同实例上的两个方法将在不同线程中运行。

这句话怎么理解?

【问题讨论】:

    标签: java testng


    【解决方案1】:

    这个问题的上下文并不多,但是通过谷歌快速找到了source

    您的测试套件将创建许多不同类的实例,然后对它们运行一些测试。这种特殊的并行模式保证了当您的测试套件在任何创建实例上调用多个方法时,这将在同一个线程中完成。

    为什么这很重要?好吧,某些功能可能依赖于一致的线程,例如,如果他们使用ThreadLocal。此外,除非您的实例是线程安全的,否则允许多个线程对其调用方法可能会导致干扰。

    如果您不确定所有这些关于线程安全的讨论是什么,那么您可能不想并行运行您的测试套件。或者也许将其限制为parallel="tests",并确保测试标签之间有明确的分隔。

    【讨论】:

    • @CedricBeust 谁来决定每个类的实例数量? (如果可能,请澄清官方文档)
    【解决方案2】:

    TestNG 的默认行为是根本不使用并行线程。

    parallel 属性设置如何套件在使用并行线程时执行其方法。

    为清楚起见,考虑一个测试类:

    public class StuffTest {
        @Test
        public void doStuffTest() {
            // do your thing
        }
    }
    

    默认情况下(无并行):

    • StuffTest 的新实例(比如st)将在每次测试运行时创建;和
    • st 的每个方法都会按顺序执行(顺序取决于其他设置)。

    当您使用parallel 属性时,TestNG 将使用并行线程同时运行测试。 parallel 的值将设置这些线程将如何处理测试类实例和方法。Check the docs for the possible options。)

    parallel="instances" 表示如果您有多个StuffTest 实例(比如sasb):

    • 实例sa的所有方法都将在同一个线程中执行(比如线程ta)。
    • 实例sb的所有方法都会在同一个线程中执行(比如线程tb)。
    • 还有 ta != tb

    【讨论】:

    • 您的答案太含糊,因为您未能解决 TestNG 如何/何时实例化多个实例。如果 TestNG 决定为每个方法实例化一个类,则此执行模型将等效于 parallel="method"
    • @acdcjunior 说每次测试运行都会创建新的测试类实例是错误的。例如,我采用了一个测试类,创建了一个静态变量(计数器)并在该类的无参数构造函数中增加该变量。这个测试类有三个测试。当我运行它时,所有测试的静态变量只增加一次,即所有测试的 counter=1,这意味着它的所有三个测试只创建这个测试类的一个实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2016-03-19
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多