我们首先来思考为什么需要并发执行,并发执行的目的就是为了解决当我们编写的测试用例有成千上万的测试用例的时候,这个时候

就得思考怎么样来高效的执行完所有的测试用例,这个时候就得考虑并发执行的方式来提高测试执行的效率,目的就是为了解决执行耗时

的问题,在TestNG测试框架中我们可以使用多线程并发执行的方式,来达到执行测试用例的效率。所以在本文章中我们会系统的介绍到

多线程的测试,并发执行测试,测试套件中使用并发执行的测试,以及并发执行的方式。我们还是通过一个简单的测试案例来详细的了解

下多线程的测试,测试案例源码具体如下:

package test.parallelism;

import org.testng.annotations.Test;

public class SimpleClass
{
    @Test
    public void test_one()
    {
        long id=Thread.currentThread().getId();
        System.out.println("this one id:"+id);
    }

    @Test
    public void test_two()
    {
        long id=Thread.currentThread().getId();
        System.out.println("this two id:"+id);
    }

}

 

testng.xml的配置文件信息如下,配置文件的内容为:

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

<suite name="Simple Test" parallel="methods" thread-count="2">
    <test name="simple test">
        <classes>
            <class name="test.parallelism.SimpleClass"></class>
        </classes>
    </test>
</suite>

 

选择testng.xml的配置文件后,执行,就会显示出不同的进程ID的信息,结果信息如下所示:

testng 单个用例执行 java testng并行执行用例_testng 单个用例执行 java

 

我们依据执行结果信息以及testng.xml的配置文件内容可以看得出来,我们是使用了两个线程来执行该任务,所以执行结束后它就会

显示不同的进程ID的信息。我们可以让我们的案例更加丰富下,其TestNG的测试框架是支持并发执行不同的测试方法的,我们继续完

善我们的测试用例,完善后的案例代码为:

package test.parallelism;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class SimpleUiClass
{
    WebDriver driver;

    @BeforeMethod
    public void setUp()
    {
        driver=new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("http://www.baidu.com/");
    }

    @AfterMethod
    public void tearDown()
    {
        driver.quit();
    }

    @Test
    public  void test_baidu_title()
    {
        Assert.assertEquals(driver.getTitle(),"百度一下,你就知道");
    }

    @Test
    public void test_baidu_url()
    {
        Assert.assertEquals(driver.getCurrentUrl(),"https://www.baidu.com/");
    }

    @Test
    public void test_so_keyword()
    {
        WebElement so=driver.findElement(By.id("kw"));
        so.sendKeys("无涯课堂为您服务!");
        Assert.assertEquals(so.getAttribute("value"),"无涯课堂为您服务!");
    }
}

 

我们不使用并发编程的方式,我们执行如上的测试用例,执行耗时为7S多,我们整合testng.xml的多线程后,testng.xml的配置文件

内容为:

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

<suite name="Simple Test" parallel="methods" thread-count="2">
    <test name="simple test" group-by-instances="true">
        <classes>
            <class name="test.parallelism.SimpleUiClass"></class>
        </classes>
    </test>
</suite>

 

选择testng.xml的文件后,执行结果耗时会少于7S的时间,具体这里就不显示并发执行的结果信息了。

      前面我们更多的是在一个类里面的测试方法,下来我们演示针对类级别的并发执行,也就是说演示多个类并发执行后,它的

结果信息呈现出的结果信息,具体testng.xml的配置文件信息内容为:

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

<suite name="Simple Test" parallel="methods" thread-count="2">
    <test name="simple test">
        <classes>
            <class name="test.parallelism.SimpleUiClass"></class>
            <class name="test.parallelism.SimpleUiTwo"></class>
        </classes>
    </test>
</suite>

 

执行后的结果信息如下所示:

testng 单个用例执行 java testng并行执行用例_xml_02

 

 

根据结果信息可以看到, 针对类级别的多线程的测试,它会根据当前的资源情况随机的进行分配任务然后进行执行。

     其实测试套件我们有所讲过的,就是在一个测试套件里面会有很多的测试用例,我们也可以针对测试套件的级别进行并发测试,具体

还是结合案例来演示这些,具体testng.xml配置信息如下:

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

<suite name="Simple Test" parallel="methods" thread-count="2">
    <test name="OneTest">
        <classes>
            <class name="test.parallelism.SimpleUiClass"></class>
        </classes>
    </test>
    <test name="TwoTest">
        <classes>
            <class name="test.parallelism.SimpleUiTwo"></class>
        </classes>
    </test>
</suite>

 

执行后的结果信息为:

testng 单个用例执行 java testng并行执行用例_testng 单个用例执行 java_03

 

 

 可以看到针对测试套件的执行,主要针对的就是类里面的测试方法,其实我个人是喜欢这种方式的。

    最后我们来看把测试用例配置在多个多线程环境中执行,案例源码为:

package test.parallelism;

import org.testng.annotations.Test;

public class PoolThreadTest
{
    @Test(threadPoolSize = 3,invocationCount = 6,timeOut = 1000)
    public void test_one()
    {
        long id=Thread.currentThread().getId();
        System.out.println("test method executing on thread with id:"+id);
    }
}

 

testng.xml的配置文件内容为:

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

<suite name="Simple Test" parallel="methods" thread-count="2">
    <test name="OneTest">
        <classes>
            <class name="test.parallelism.PoolThreadTest"></class>
        </classes>
    </test>
</suite>

 

我们可以看到,线程是3,调用计数是6,执行后,会显示三个不同的进程ID的信息,但是会执行6个任务,感觉和参数化结

合起来,功能会更加的强大。本次案例执行后的结果信息如下所示:

testng 单个用例执行 java testng并行执行用例_xml_04

 

 关于并发的执行就介绍到这里。

     感谢您的阅读,后续会持续介绍TestNG测试框架的案例应用和实战。