厦门 网站优化,手机头像制作软件app,企业融资风险及其防范措施,上海网站开发售后服务一、Appium的简介
移动端的自动化测试框架
模拟人的操作进行功能自动化常用于功能测试、兼容性测试
跨平台的自动化测试
二、Appium的原理
核心是web服务器#xff0c;接受客户端的连接#xff0c;接收客户端的命令#xff0c;在手机设备上执行命令#xff0c;收集命令…一、Appium的简介
移动端的自动化测试框架
模拟人的操作进行功能自动化常用于功能测试、兼容性测试
跨平台的自动化测试
二、Appium的原理
核心是web服务器接受客户端的连接接收客户端的命令在手机设备上执行命令收集命令执行的结果。
Session客户端初始化一个 session 会话发送 POST/session 请求到服务器端这些请求里面都会带有一个对象desiredCapabilities这个时候服务器端会启动自动化 session 然后返回一个 session ID以后的命令都会用这个 seesion ID 去匹配。
desired capabilities 对象其实是一个 key-value 的集合里面包含了各种各样的信息发送到服务器端后服务器解析这些信息就知道了客户端对哪种 session 感兴趣然后就会启动相应的session这里面的信息会影响着服务器端启动 session 的类型。
Appium ServerAppium 是一个用 Node.js 编写的 HTTP server它创建、并管理多个 WebDriver sessions 来和不同平台交互。
Apium ClientsAppium 开始一个测试后就会在被测设备手机上启动一个 server 监听来 自 Appium server 的指令每种平台如 iOS 和 Android都有不同的运行和交互方式所以 Appium 会用某个桩程序“侵入”该平台并接受指令来完成测试用例的运行。
三、Appium的使用
3.1导入依赖
dependencygroupIdorg.testng/groupIdartifactIdtestng/artifactIdversion7.0.0-beta1/version/dependencydependencygroupIdio.appium/groupIdartifactIdjava-client/artifactIdversion8.5.1/version!-- scopetest/scope--/dependencydependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion4.9.1/version/dependency
3.2 创建测试类
使用test注解类的名字要符合标识符命名规则即可 import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.Test;public class NewTest {//定义 AppiumDriver 对象 AppiumDriver driver;Testpublic void f(){}}3.3 BeforeClass 注解
BeforeClass 注解 用于设定进入测试类后在所有测试之前首先要执行的代码指定测试设备平台。 BeforeClasspublic void beforeClass() throws MalformedURLException {//指定测试设备信息DesiredCapabilities devicenew DesiredCapabilities();//使用移动设备或模拟器种类device.setCapability(deviceName,Android Emulator);//指定哪个移动操作平台device.setCapability(platformName, Android);//指定移动操作系统版本device.setCapability(platformVersion, 4.4.2);//指定 app 程序包名即被测程序名device.setCapability(appPackage,com.android.calculator2);//指定 app 启动页名称device.setCapability(appActivity,.Calculator);//启动appdriver new AndroidDriver(new URL(http://localhost:4723/wd/hub),device);}
3.4 AfterClass 注解
在所有测试之后再执行的代码可在该注解写入app退出代码 AfterClasspublic void afterClass() {//退出appdriver.quit()}
3.5 Test属性 注解 指定要测试的方法方法名只要符合标识符命名规则。 属性
description测试描述 priority优先级从 0 开始 timeout?ms超时时间 dataProviderDataprovider 的名称或方法名 dataProviderClass产生测试数据的类 Test(description123,priority0)public void f() {System.out.println(hello);}
3.6 识别操作元素
通过\Android\android-sdk\tools\ uiautomatorviewer 去探操作元素的id driver.findElementById(resource-id 属性)
driver.findElementByClassName(class 属性) Test(description123,priority0)public void f() {//点击driver.findElementById(com.android.calculator2:id/digit3).click();driver.findElementById(com.android.calculator2:id/plus).click();driver.findElementById(com.android.calculator2:id/digit2).click();driver.findElementById(com.android.calculator2:id/equal).click();//获取文本String sumdriver.findElementByClassName(android.widget.EditText).getText();//输入driver.findElementById(属性).sendKeys(数据);//清空driver.findElementById(属性).clear();System.out.print(sum);}
3.7 断言
断言主要用于判断预期结果与实际结果是否一致 //用于测试期望结果的断言即测试两个对象是否相等Assert.assertEquals(实际值, 期望值);//布尔值断言Boolean rssum.contains();Assert.assertTrue(rs);
3.8 模拟按键 driver.pressKeyCode(keycode)必须使用 AmdroidDriver
AndroidDriver driver;Test
public void f() {driver.pressKeyCode(按键);
}
3.9 参数化
使用数组返回参数
DataProvider
public Object[][] getData(){Object data[][]{ {234,,56,290},{256,-,40,216}, {3,*,6,18} };return data;
}Test(dataProvidergetData)
public void f(String one,String two,String exact) {}
读参数文件
DataProviderpublic Object[][] getParam() throws Exception{ListString[] rowsnew ArrayListString[]();//导入文件File filenew File(文件路径);//读取字节文件FileReader readernew FileReader(file);//字节转字符BufferedReader buffernew BufferedReader(reader);String rownull;//读取每一行数据while((rowbuffer.readLine())!null){String columns[]row.split(\t);rows.add(columns);}//文件关闭reader.close();//转换ObjectObject[][] datanew Object[rows.size()][];for(int i0;irows.size();i)data[i]rows.get(i);return data;}
定义获得参数的单独类和方法 使用DataProvider(name测试数据集名)修饰获取参数的方法名。 Test(dataProvidergetParam,dataProviderClass参数类名.class)
public class Parm {DataProvider()public Object[][] getParam() throws Exception{Object data[][]{ {234,,56,290},{256,-,40,216}, {3,*,6,18} };return data;}}3.10 测试报告
java项目加入TestReport
package app; //修改为正确的包名
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;public class TestReport extends TestListenerAdapter{private String reportPath;Overridepublic void onStart(ITestContext context) {File htmlReportDir new File(test-output);if (!htmlReportDir.exists()) {htmlReportDir.mkdirs();}String reportName formateDate()_result.html;reportPath htmlReportDir/reportName;File report new File(htmlReportDir,reportName);if(report.exists()){try {report.createNewFile();} catch (IOException e) {e.printStackTrace();}}StringBuilder sb new StringBuilder(htmlheadmeta http-equiv\Content-Type\ content\text/html; charsetutf-8\ / title自动化测试报告/title/headbody style\background-color:#99FFCC;\ div id\top\ align\center\p style\font-weight:bold;\测试用例运行结果列表/p table width\90%\ height\80\ border\1\ align\center\ cellspacing\0\ rules\all\ style\table-layout:relative;\ thead tr th测试用例名/th th测试用例结果/th /tr /thead tbody style\word-wrap:break-word;font-weight:bold;\ align\center\);String res sb.toString();try { Files.write((Paths.get(reportPath)),res.getBytes(utf-8)); } catch (IOException e) { e.printStackTrace(); } }Overridepublic void onTestSuccess(ITestResult result) {StringBuilder sb new StringBuilder(trtd);sb.append(result.getMethod().getRealClass().result.getMethod().getMethodName());sb.append(/tdtdfont color\green\Passed/font/td/tr);String res sb.toString();try {Files.write((Paths.get(reportPath)),res.getBytes(utf-8),StandardOpenOption.APPEND);} catch (IOException e) {e.printStackTrace();}}Overridepublic void onTestSkipped(ITestResult result) {StringBuilder sb new StringBuilder(trtd);sb.append(result.getMethod().getRealClass().result.getMethod().getMethodName());sb.append(/tdtdfont color\yellow\Skipped/font);sb.append(p align\left\测试用例font color\red\跳过/font原因br);sb.append(bra style\background-color:#CCCCCC;\);Throwable throwable result.getThrowable(); sb.append(throwable.getMessage()); sb.append(/a/p/td/tr);String res sb.toString();try {Files.write((Paths.get(reportPath)),res.getBytes(utf-8),StandardOpenOption.APPEND);} catch (IOException e) {e.printStackTrace();}}Overridepublic void onTestFailure(ITestResult result) {StringBuilder sb new StringBuilder(trtd);sb.append(result.getMethod().getRealClass().result.getMethod().getMethodName());sb.append(/tdtdfont color\red\Failed/fontbr);sb.append(p align\left\测试用例执行font color\red\失败/font原因br);sb.append(bra style\background-color:#CCCCCC;\);Throwable throwable result.getThrowable();sb.append(throwable.getMessage());sb.append(/a/p/td/tr);String res sb.toString();try {Files.write((Paths.get(reportPath)),res.getBytes(utf-8),StandardOpenOption.APPEND);} catch (IOException e) {e.printStackTrace();}}Overridepublic void onFinish(ITestContext testContext) {StringBuilder sb new StringBuilder(/tbody/tablea href\#top\返回顶部/a/div/body);sb.append(/html);String msg sb.toString();try {Files.write((Paths.get(reportPath)),msg.getBytes(utf-8),StandardOpenOption.APPEND);} catch (IOException e) {e.printStackTrace();}}public static String formateDate(){SimpleDateFormat sf new SimpleDateFormat(yyyyMMdd HHmmss);Calendar cal Calendar.getInstance();Date date cal.getTime();return sf.format(date);}
} 测试类中添加监听器Listeners({TestReport.class})即可class 是固定关键字放到测试类名的上一行
Listeners({TestReport.class})
public class NewTest {} 测试报告默认存储位置Java 项目名\test-output
四、adb命令使用 android debug bridge 即 android 调试桥在cmd输入
查看版本 adb version
显示所有的设备 adb devices
安装程序 adb install .apk 文件名apk 文件名即程序包名程序名中不要使用汉字 卸载 App adb uninstall 完整包名包名不是 apk 文件名可以使用uiautomatorviewer寻找package 查看手机操作系统的版本号 adb shell getprop ro.build.version.release
显示设备中的包以及包的启动项
所有包 adb shell getprop ro.build.version.release 查找某个包 adb shell pm list packages | findstr 查找关键字
查找启动项 adb shell dumpsys window w | findstr \/ | findstr name
需要提前启用app
在指定设备中运行命令 adb -s 设备名 shell 命令
adb 服务器的开关 adb start-server adb kill-server
五、