本文注重自动化测试用例并行方案的设计,忽略了具体代码实现的细节。代码实现细节大家利用网络资源可以轻松搜索到相关内容!
方案概述
目前业界主流提升测试效率的方案如下:
自动化测试脚本并行运行;
在多终端同时跑脚本;
编写自定义类库解决自动化api无法提供的功能或者对工具提供的api进行二次封装,核心就是增强脚本健壮性;
自动化脚本执行完毕后,自动发送测试报告给相关责任人,使其第一时间了解自动化测试结果;
方案如下图所示:
脚本稳定
编写自定义类库解决自动化api无法提供的功能或者对工具提供的api进行二次封装。主要解决的问题包括:动态元素识别、页面加载延迟、网络延迟、脚本失败重试。总之尽量避免因为自动化测试脚本的质量问题导致自动化测试执行失败。这就需要自动化脚本编写人员有很强的编码功底。
多端并行
web端,本质通过使用Selenium Grid实现:
移动端,本质通过启动多个Appium Server,每个Appium server连接一个设备。可以在同一台机器上启动多个Appium Server(每个server有不同的端口)。可以使用Selenium Gird控制appium server。
脚本并行
有了多端并行运行的技术方案,那么下一个问题就是让我们的测试用例并发的在多端中运行。我们这里以Java的TestNG测试框架为例作为讲解。TestNG在处理用例并发方面是非常方便的。
TestNG有多种并发方式支持,主要包括:方法的并发,class级的并发,和test级的并发,它们的区别如下:
tests级别:不同test tag下的用例可以在不同的线程执行,相同test tag下的用例只能在同一个线程中执行。
classs级别:不同class tag下的用例可以在不同的线程执行,相同class tag下的用例只能在同一个线程中执行。
methods级别:所有用例都可以在不同的线程去执行。
xml文件中配置如下
<suitename="Testng Parallel Test"parallel="tests"thread-count="5">
<suitename="Testng Parallel Test"parallel="classes"thread-count="5">
<suitename="Testng Parallel Test"parallel="methods"thread-count="5">
<suitename="My suite" parallel="instances" thread-count="5">
实践中,很多时候我们在测试类中通过dependOnMethods/dependOnGroups方式,给很多测试方法的执行添加了依赖,以达到期望的执行顺序。TestNG能在多线程情况下依然遵循既定的用例执行顺序去执行。有些时候,我们需要对一个测试用例,比如一个http接口,执行并发测试,即一个接口的反复调用。在
@Test标签中指定threadPoolSize和invocationCount可以实现该需求。
例如:@Test(threadPoolSize=5,invocationCount=10)
其中threadPoolSize表明用于调用该方法的线程池容量,该例就是同时起5个线程并行执行该方法;invocationCount表示该方法总计需要被执行的次数。该例子中5个线程同时执行,当总计执行次数达到10次时停止。
实例如下:
写两个类 ThreadCase1和ThreadCase1
public class ThreadCase1 {
@Test
public void m1()throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2()throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
}
public class ThreadCase2 {
@Test
public void m1()throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
}
在配置文件中指定parallel为class,thread-count值为2
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
"TestngParallel Test"parallel="classes "thread-count="2">
"case1">
<classes>
"com.my.test5.ThreadCase1"/>
"com.my.test5.ThreadCase2"/>
</classes>
</test>
</suite>
查看运行结果:3292ms完成测试,如果不使用多线程则至少需要6s
原创不易,如果文章帮到了你,欢迎转发,让更多的朋友受益!