用例修改testng格式与多设备运行用例

一、把测试用例写成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>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值