JAVA单元测试框架-15-TestNG并行执行测试用例

本文介绍如何使用TestNG框架进行测试用例的并发多线程执行。通过不同级别的配置(方法级别、类级别、测试级别及实例级别),实现测试用例的有效并行执行,提高测试效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TestNG在执行测试时,默认suitethreadpoolsize=1,-randomizesuites=false,即非并发顺序执行测试。

但是TestNG提供了多种方式,以支持测试的并发多线程执行。

java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml 通过配置testng.xml实现

方法级别

测试类:

package TestNg.paraller;

import org.testng.annotations.Test;

public class Testone {
    @Test()
    public void test1()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test1-1 thread id:"+id);
    }

    @Test
    public void test2()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test1-2 thread id:"+id);
    }
}
package TestNg.paraller;

import org.testng.annotations.Test;

public class Testtwo {

    @Test()
    public void test1()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test2-1 thread id:"+id);
    }

    @Test
    public void test2()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test2-2 thread id:"+id);
    }
}

 testng.xml问件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="threadSuite" parallel="methods" thread-count="3">
    <test name="Test">
        <classes>
            <class name="TestNg.paraller.Testone"></class>
            <class name="TestNg.paraller.Testtwo"></class>
        </classes>
    </test>
  <!--  <listeners>
        <listener class-name="report.ExtentReport"></listener>
    </listeners>-->
  <!-- 这是reportNG的监听类-->
  <!--  <listeners>
         <listener class-name="org.uncommons.reportng.HTMLReporter"></listener>
         <listener class-name="org.uncommons.reportng.JUnitXMLReporter"></listener>
     </listeners>-->
    <listeners>
        <listener class-name="report.ZTestReport"></listener>
    </listeners>
</suite>

方法级别运行,一次运行三个方法,顺序是不确定的

 

类级别

类级别运行,按类运行,一次运行一个类中的方法。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="classes" thread-count="3"   verbose="2">
    <test name="Test">
        <classes>
            <class name="TestNg.paraller.Testone"></class>
            <class name="TestNg.paraller.Testtwo"></class>
        </classes>
    </test>
    <listeners>
        <listener class-name="report.ExtentReport"></listener>
    </listeners>
</suite>

书写两个Test测试 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="classes" thread-count="3"   verbose="2">
    <test name="Test">
        <classes>
            <class name="TestNg.paraller.Testone"></class>
            <class name="TestNg.paraller.Testtwo"></class>
        </classes>
    </test>
    <test name="Test2">
        <classes>
            <class name="TestNg.paraller.TestThree"></class>
        </classes>
    </test>
    <listeners>
        <listener class-name="report.ExtentReport"></listener>
    </listeners>
</suite>

 会先执行第一个Test类,在执行第二个Test

 

Test级别

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="tests" thread-count="3"   verbose="2">
    <test name="Test" preserve-order="true" enabled="true">
        <classes>
            <class name="TestNg.paraller.Testone"></class>
            <class name="TestNg.paraller.Testtwo"></class>
        </classes>
    </test>
    <test name="Test2">
        <classes>
            <class name="TestNg.paraller.TestThree"></class>
        </classes>
    </test>
    <listeners>
        <listener class-name="report.ExtentReport"></listener>
    </listeners>
</suite>

在test级别运行,上下两个test是一起运行的,上面运行一个方法,下面也运行一个方法

 

instances级并发

package TestNg.paraller;

import org.testng.annotations.Factory;
import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.List;

public class FactoryTest {
    private String host;
    private int port;

    public FactoryTest(String host, int port)
    {
        this.host=host;
        this.port=port;
    }

    @Test
    public void login()
    {
        long id = Thread.currentThread().getId();
        System.out.println("login, host:"+host+";port"+port+";id:"+id);
    }

    @Test(dependsOnMethods="login")
    public void logout()
    {
        long id = Thread.currentThread().getId();
        System.out.println("logout, host:"+host+";port"+port+";id:"+id);
    }

    @Factory
    public static Object[] create()
    {
        List<FactoryTest> list = new ArrayList<FactoryTest>();
        list.add(new FactoryTest("10.10.10.1", 8080));
        list.add(new FactoryTest("10.10.10.2", 8080));
        return list.toArray();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--并发执行用例-->
<suite name="All Test Suite" parallel="instances" thread-count="4"   verbose="2">
    <test name="Test" preserve-order="true" enabled="true">
        <classes>
            <class name="TestNg.paraller.FactoryTest"></class>
        </classes>
    </test>
    <listeners>
        <listener class-name="report.ExtentReport"></listener>
    </listeners>
</suite>

 测试结果如下:

测试用例级并发

 线程池为3,一次执行6次,时间为1000毫秒

package TestNg.paraller;

import org.testng.annotations.Test;

public class ThreadTest {
    @Test(threadPoolSize = 3, invocationCount = 6, timeOut = 1000)
    public void test1()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test1-1 thread id:"+id);
    }

    @Test
    public void test2()
    {
        long id = Thread.currentThread().getId();
        System.out.println("test1-2 thread id:"+id);
    }
}

通过suit 和test标签设定测试用例的顺序以及测试的并发性,可以用来实现并发执行多测试用例。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值