一、把测试用例写成testng的格式,多设备运行用例具备的条件:
1)需分两个(或多个)线程执行用例
2)启动两个模拟器,一个设备对应一个服务端
3)需要启动两个服务端且需要指定不同端口
AppiumUtil.java类添加截图方法
/**
* 截图
* @param fileName
* @throws Exception
*/
public void takeScreenImage(String fileName) throws Exception {
File file=driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file, new File("images/"+fileName+".png"));
}
InitDriver.java类添加带参数的驱动方法
/**
* 创建启动已经安装应用的driver
* @param appPackage 启动应用的包名
* @param appActivity 启动应用的起始activity
* @port 多设备执行传入的端口号
* @udid 多设备执行传入手机的udid
* @return AndroidDriver
* @throws Exception
*/
public static AndroidDriver<AndroidElement> getDriverByUiAlreadyInstallPort(String udid,String port,String appPackage,String appActivity) throws Exception{
DesiredCapabilities caps =commonCaps();
//在session创建之前不重置应用
//caps.setCapability(MobileCapabilityType.NO_RESET, true);
caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, appPackage);
caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, appActivity);
caps.setCapability(MobileCapabilityType.UDID, udid);
//解决安装后的app打开多次报session创建失败的问题,填写真正启动以后的activity非起始的
//caps.setCapability(AndroidMobileCapabilityType.APP_WAIT_ACTIVITY, "cn.mwpark.xiniubox.activity.TabParkManagerActivity");
AndroidDriver<AndroidElement> driver = new AndroidDriver<>(new URL(
"http://127.0.0.1:"+port+"/wd/hub"), caps);
return driver;
}
package com.appium.testng;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.appium.driver.InitDriver;
import com.appium.util.AppiumUtils;
import com.appium.zhihu.Login;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
//使用数据驱动,从配置文件传递参数
public class ZhihuLoginTestng {
AndroidDriver<AndroidElement> driver;
//多线程执行需要启动两个模拟器需要写入udid,一个设备对应一个服务端,所以需要启动两个服务端且需要指定不同端口
//截图问题,可添加当前线程避免覆盖;appium -p 4490(服务端口) -bp 3456(设备端口)
@Parameters({"port","udid"})
@BeforeClass
public void initDriver(String port,String udid) throws Exception{
driver=InitDriver.getDriverByUiAlreadyInstallPort(udid,port,"com.zhihu.android", "com.zhihu.android.app.ui.activity.MainActivity");
}
@Parameters({"name","pwd","assertValue"})
@Test
public void test001_login(String name,String pwd,String assertValue){
Login login=new Login(driver);
try {
login.loginByPatameter(name, pwd);
Assert.assertEquals(driver.getPageSource().contains(assertValue), true);
} catch (Exception e) {
e.printStackTrace();
AppiumUtils appiumUtils=new AppiumUtils(driver);
try {//失败截图
appiumUtils.takeScreenImage("loginError"+Thread.currentThread());
} catch (Exception e1) {
e1.printStackTrace();
}
Assert.fail("登录失败");
}
}
@AfterClass
public void quit() throws Exception{
driver.quit();
Thread.sleep(8000);//因为退出需要做很多事情给他时间以防下一个启动时还没结束
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!-- parallel从哪个层级开始并发,此处是test表示test标签,thread-count线程数为几个就需要设置几个test标签 -->
<!-- 需要启动两个模拟器,一个设备对应一个服务端,所以需要启动两个服务端且需要指定不同端口 -->
<!-- 启动服务 -->
<suite name="Default suite" parallel="tests" thread-count="2">
<test name="Test1">
<parameter name="name" value="vop_jiangfeifei@163.com"/>
<parameter name="pwd" value="1234abcd"/>
<parameter name="assertValue" value="登录知乎"/>
<parameter name="port" value="4490"/>
<parameter name="udid" value="127.0.0.1:62001"/>
<classes>
<class name="com.appium.testng.ZhihuLoginTestng"/>
</classes>
</test>
<test name="Test2">
<parameter name="name" value="vop_jiangfeifei@163.com"/>
<parameter name="pwd" value="1234abcd"/>
<parameter name="assertValue" value="登录知乎"/>
<parameter name="port" value="4491"/>
<parameter name="udid" value="127.0.0.1:62025"/>
<classes>
<class name="com.appium.testng.ZhihuLoginTestng"/>
</classes>
</test>
</suite>
二、多个测试类一起执行
问题:多个测试类执行时用例需要从首页开始编写,以免点在了别的页面影响用例执行
package com.appium.testng;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import com.appium.driver.InitDriver;
import com.appium.util.AppiumUtils;
import com.appium.zhihu.Login;
import io.appium.java_client.android.Activity;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
public class ZhihuLogOutTestng {
AndroidDriver<AndroidElement> driver;
@Parameters({"udid","port"})
@BeforeClass
public void InItDriver(String udid,String port) throws Exception{
driver=InitDriver.getDriverByUiAlreadyInstallPort(udid,port,"com.zhihu.android", "com.zhihu.android.app.ui.activity.MainActivity");
}
@Test(dependsOnMethods="test001_login")
public void logUotTest(){
Login login=new Login(driver);
try {
login.logOut();
} catch (Exception e) {
AppiumUtils appiumUtils=new AppiumUtils(driver);
try {
appiumUtils.takeScreenImage("logoutError"+Thread.currentThread());
} catch (Exception e1) {
e1.printStackTrace();
}
Assert.fail(e.getMessage());
}
}
//如果测试用例没有依赖关系,建议重启app,以防落在了其他页面影响用例执行,用例步骤需从首页开始设计
@AfterMethod
public void reset(){
//重启app
Activity activity=new Activity((String)driver.getCapabilities().getCapability("appPackage"),(String)driver.getCapabilities().getCapability("appActivity"));
driver.startActivity(activity);
}
@AfterClass
public void quit() throws Exception{
driver.resetApp();//清空app数据,恢复刚安装的状态
driver.quit();
Thread.sleep(8000);//因为退出需要做很多事情给他时间以防下一个启动时还没结束
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!-- parallel从哪个层级开始并发,此处是test表示test标签,thread-count线程数为几个就需要设置几个test标签 -->
<!-- 需要启动两个模拟器,一个设备对应一个服务端,所以需要启动两个服务端且需要指定不同端口 -->
<!-- 启动服务 -->
<suite name="Default suite" parallel="tests" thread-count="2">
<test name="Test1">
<parameter name="name" value="vop_jiangfeifei@163.com"/>
<parameter name="pwd" value="1234abcd"/>
<parameter name="assertValue" value="登录知乎"/>
<parameter name="port" value="4490"/>
<parameter name="udid" value="127.0.0.1:62001"/>
<classes>
<class name="com.appium.testng.ZhihuLoginTestng"/>
<class name="com.appium.testng.ZhihuLogOutTestng"/>
</classes>
</test>
<test name="Test2">
<parameter name="name" value="vop_jiangfeifei@163.com"/>
<parameter name="pwd" value="1234abcd"/>
<parameter name="assertValue" value="登录知乎"/>
<parameter name="port" value="4491"/>
<parameter name="udid" value="127.0.0.1:62025"/>
<classes>
<class name="com.appium.testng.ZhihuLoginTestng"/>
<class name="com.appium.testng.ZhihuLogOutTestng"/>
</classes>
</test>
</suite>