利用 TestNG 并行执行用例
原文地址https://testerhome.com/topics/1639
一、测试类*注1
package com.testerhome; import io.appium.java_client.android.AndroidDriver; import java.net.MalformedURLException;
import java.net.URL; import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass; public class Suite1 {
public String port;
public String udid;
private AndroidDriver driver; @Test
public void switches() throws InterruptedException {
WebElement sound = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Sound\")");
sound.click();
System.out.println("checked");
Thread.sleep(2000);
System.out.println(Thread.currentThread());
} @BeforeSuite
@Parameters({ "port", "udid" })
public void beforeSuite(String port, String udid) {
this.port = port;
this.udid = udid; } @BeforeClass
public void beforeClass() throws MalformedURLException{
System.out.println(“port is ” + port + “, udid is " + udid); DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","device");
capabilities.setCapability("automationName","Appium");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("udid", udid);
capabilities.setCapability("appPackage", "com.android.settings");
capabilities.setCapability("appActivity", ".Settings");
driver = new AndroidDriver(new URL("http://127.0.0.1:" + port + "/wd/hub"), capabilities); } @AfterClass
public void afterClass() {
driver.quit(); } }
二、连接两个 Android 设备或启动两个虚拟机
使用adb devices
获取 udid
三、项目路径下新建两个 testng.xml
testng1.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1">
<parameter name = "port" value = "4723"/>
<parameter name = "udid" value = "emulator-5554"/>
<test name="Test">
<classes>
<class name="com.testerhome.Suite1"/>
</classes>
</test>
</suite>
testng2.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite2">
<parameter name = "port" value = "4725"/>
<parameter name = "udid" value = "emulator-5556"/>
<test name="Test">
<classes>
<class name="com.testerhome.Suite1"/>
</classes>
</test>
</suite>
四、开启两个 appium server *注2、注3
如果命令行启动加参数appium -p 4723 -bp 4724appium -p 4725 -bp 4726
如果是图形界面,修改:
第一个:
General Settings 里的 Port ,改为4723
Android Settings 里的 Bootstrap Port ,改为4724
第二个:
General Settings 里的 Port ,改为4725
Android Settings 里的 Bootstrap Port ,改为4726
五、导出依赖*注4
因为是用 maven 工程创建的,所以先导出依赖到项目路径下的lib文件夹mvn dependency:copy-dependencies -DoutputDirectory=lib
六、执行测试
先用 Maven 串行执行一次以编译出Class文件mvn clean test
然后java -classpath ".\target\test-classes" -Djava.ext.dirs=lib org.testng.TestNG -suitethreadpoolsize 2 testng1.xml testng2.xml
如果没有配置TestNG环境变量java -classpath ".\target\test-classes;D:\Programs\testng-6.8\testng-6.8.jar" -Djava.ext.dirs=lib org.testng.TestNG -suitethreadpoolsize 2 testng1.xml testng2.xml
七、查看报告
默认在项目路径下的 test-output 文件夹
注1:
这个测试类没有指定 app 路径,如果指定,同时 unzip 的时候会冲突。目前是复制了多个 apk 。
File app = new File(appDir, "AppName"+port+".apk");
并在appium server指定不同的临时文件路径,比如:
--tmp D:\tem1
--tmp D:\tem2
注2:
两个端口的介绍可以看这两个链接:
appium 自动化测试教程 ppt(第二版)
Appium Android Bootstrap源码分析之简介
注3:
如果使用到 Selendroid 或 Chromium ,还需要指定其他端口(需要修改测试类)
Selendroid port:8080
Selendroid port:8081
Chromium port:9515
Chromium port:9516
注4:
本来准备直接用 mvn test 并行执行的,但没试出来传 suitethreadpoolsize 参数的办法
利用 TestNG 并行执行用例的更多相关文章
- IOS:利用dispatch_once创建单例
在之前有一篇学习笔记中,记载了一篇如何在OC中实现单例的文章:<IOS学习笔记4—Objective C—创建单例>自苹果引入了Grand Central Dispatch (GCD)(M ...
- 如何解决testng执行用例失败自动重跑问题
注: 以下内容引自 http://blog.csdn.net/MenofGod/article/details/72846649 看过几个相关问题的帖子,内容类似,不过这篇解决问题的步骤和代码比较清晰 ...
- IOS基础学习日志(七)利用dispatch_once创建单例及使用
自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行. ...
- 利用Testng注释实现多线程并发测试
Testng 是一款非常优秀的测试框架,真正从测试角度出发,为测试所想.在测试过程中我们经常会遇到对某一个场景做并发请求,主要想了解该程序在并发时是否会有异常或者没考虑到的其他情况,这时往往不是要做性 ...
- selenium 利用testNG对异常进行自动截图
哈哈哈,很久没写博客了,懒了. 因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下.下面给一些需要 ...
- testng执行用例失败,再次执行
我们通过重写testng的retry方法和transform方法来实现用例失败重跑的功能. 首先添加两个文件 TestngRetry.java public class TestngRetry imp ...
- TestNG设置用例循环执行
曾经做过一需求,需要单个集成测试用例循环执行N次,或许你会说for循环就可以了,这当然是可以的.那有没有逼格更高点的方法,当然也是有的.下面我们就说下使用TestNG注解功能实现用例的循环执行. 1. ...
- 利用dispatch_once创建单例
无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例 ...
- 执行testng appium用例失败,自动截图
新建一个截图监听类ScreenShotListener ,重写onTestFailure方法,里面定义了 监听的driver ,截图文件路径和名称 package com.fsssc.htsgl.ut ...
随机推荐
- 超全面的JavaWeb笔记day22<文件上传>
文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 1. 必须使用 ...
- 经典 MapReduce框架(MRv1)
在 MapReduce 框架中,作业执行受两种类型的进程控制: 一个称为 JobTracker 的主要进程,它协调在集群上运行的所有作业,分配要在 TaskTracker 上运行的 map 和 red ...
- 远程执行命令:paramiko
paramiko模块用于通过 ssh 登录到远程客户端主机并执行命令,常见用法如下: [root@localhost ~]$ yum install -y python-paramiko 通过用户名密 ...
- 关于HTML5的十大面试题
1.html5的文档类型和字符集分别是什么? 答:<!doctype html>/<meta charset="UTF-8"> 2.在html5中如何嵌入一 ...
- poj_2112 网络最大流+二分法
题目大意 有K台挤奶机和C头奶牛,都被视为物体,这K+C个物体之间存在路径.给出一个 (K+C)x(K+C) 的矩阵A,A[i][j]表示物体i和物体j之间的距离,有些物体之间可能没有直接通路. ...
- 详解struts2中配置action的方法
如何解决action太多的问题??我们因为需要不同的方法,所以往往建立很多不同的类,但是每个类中往往仅仅几行代码,不仅浪费了时间,而且配置起来也很繁琐,所以,建立一个共有的类,然后根据以下方式来操作, ...
- php中关于时间的用法
一.时间戳相关: 当前时间戳:time(); 把时间戳转换为时间显示:date("Y-m-d H:i:s", $a); 把日期时间转换 ...
- 【BZOJ2502】清理雪道 有上下界的网络流 最小流
[BZOJ2502]清理雪道 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...
- log4net类库配置、WebService配置
一.类库配置 结构如下图 1.LogUtility类 public class LogUtility { private static readonly log4net.ILog log = log4 ...
- Linux系统下 Supervisor 安装搭建(yum安装)
安装Supervisor # 安装supervisor yum install supervisor # 打开supervisor的配置文件 vi /etc/supervisord.conf 将sup ...