testng之多线程执行(并发执行)

多线程作用:当我们用例较多时通过多线程并行执行测试用例可以提高运行效率。

注意:当我们用例数很少时(比如只有10条),使用多线程运行反而运行效率降低,因为线程的创建和关闭也需要时间。

 

1、不同的测试方法使用不同的线程--方法级别(最常用)

xml文件配置:suite套件配置:

parallel="methods" :表示多线程是在测试方法级别

thread-count="5":表示共创建5个线程

 

总的意思:总共创建5个线程,不同的方法在5个不同的线程上执行。

 

//测试类Testa
public class Testa {

    @Test
    public void testa_1(){
        System.out.println("testaaa-1级别1执行");
        System.out.println("testaaa-1线程id:"+Thread.currentThread().getId());
    }

    @Test
    public void testa_2(){
        System.out.println("testaaa-2级别2执行");
        System.out.println("testaaa-2线程id:"+Thread.currentThread().getId());
    }

}

//测试类Testb

public class Testb {

    @Test
    public void testb_1(){
        System.out.println("testbbb_1级别1执行了");
        System.out.println("testbbb-1线程id:"+Thread.currentThread().getId());
    }

    @Test
    public void testb_2(){
        System.out.println("testbbb_2级别2执行了");
        System.out.println("testbbb-2线程id:"+Thread.currentThread().getId());
    }
}

//通过xml文件配置多线程
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="套件" parallel="methods" thread-count="5">
    <test name="运行所有用例">
        <classes>
            <class name="com.test.finance.testcase.Testa"/>
            <class name="com.test.finance.testcase.Testb"/>
        </classes>
    </test>
</suite>

// ==运行结果==\\

testbbb_2级别2执行了
testaaa-2级别2执行
testbbb-2线程id:14
testaaa-1级别1执行
testbbb_1级别1执行了
testaaa-1线程id:11
testaaa-2线程id:12
testbbb-1线程id:13

 

2、线程级别tests,即不同的test tag下使用不同的线程,同一个test tag下使用相同的线程。

 

//xml文件配置,Testa Testb类属于一个tests tag
//                    Testc 类属于一个tests tag

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="套件" parallel="tests" thread-count="5">

    <test name="第一波测试用例">
        <classes>
            <class name="com.test.finance.testcase.Testa"/>
            <class name="com.test.finance.testcase.Testb"/>
        </classes>
    </test>

    <test name="第二波测试用例">
        <classes>
            <class name="com.test.finance.testcase.Testc"/>
        </classes>
    </test>
</suite>


//==运行结果==\\ testaaa-1级别1执行 testccc_1级别1执行了 testaaa-1线程id:11 testccc-1线程id:12 testaaa-2级别2执行 testaaa-2线程id:11 testccc_2级别2执行了 testccc-2线程id:12 testbbb_1级别1执行了 testbbb-1线程id:11 testbbb_2级别2执行了 testbbb-2线程id:11

 

3、线程级别classes,即不同的测试类下使用不同的线程,同一个测试类class下使用相同的线程。

// 通过xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="套件" parallel="classes" thread-count="5">

    <test name="第一波测试用例">
        <classes>
            <class name="com.test.finance.testcase.Testa"/>
            <class name="com.test.finance.testcase.Testb"/>
        </classes>
    </test>

</suite>


//===运行结果==\\
testbbb_1级别1执行了
testaaa-1级别1执行
testbbb-1线程id:12
testaaa-1线程id:11

testbbb_2级别2执行了
testbbb-2线程id:12

testaaa-2级别2执行
testaaa-2线程id:11

 

4、直接通过@Test参数控制单个测试方法执行次数+使用的线程数

如果我们需要多次执行摸个测试方法,这时候我们可以通过改用例的@Test中的参数来控制对改用例使用多线程

@Test(invocation=执行次数, threadPoolSize=线程池线程数)

//测试方法

    @Test(invocationCount = 3,threadPoolSize = 3)
    public void testa_1(){
        System.out.println("testaaa-1级别1执行");
        System.out.println("testaaa-1线程id:"+Thread.currentThread().getId());
    }

//单独运行这个方法的结果
testaaa-1级别1执行
testaaa-1线程id:13
testaaa-1级别1执行
testaaa-1线程id:12
testaaa-1级别1执行
testaaa-1线程id:11

 上面的案例:testa_1()测试方法调用3次,并且启动3个线程,所以3次执行使用的是不同的线程执行。

 

总结:

1、通过xml文件的配置可以实现对整理测试用例的多线程配置

parallel="methods" :测试方法级别

parallel="tests" : test tag级别

parallel="classes" : class级别

2、通过@Test(invocation, threadPoolSize)参数控制单个用例的多线程执行

posted on 2021-05-30 14:15  jesse_zhao  阅读(1179)  评论(0编辑  收藏  举报

导航