app自动化设计
一.在pom.xml引入依赖
testng:测试框架用例管理
appium:需要用到appium
log4j:日志集成
allure:生成报告
二.po分层
分为基础层,page层,用例层,xml文件
1.基础层
(1)可放置前置和后置用例,打开app可放在测试前置里,关闭app可放在测试测试后置里
@BeforeTest //测试前执行的test,打开app
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("platformName", "Android");
desiredCapabilities.setCapability("platfomVersion", "8.1.0");
desiredCapabilities.setCapability("deviceName", "OPPO R11s");
desiredCapabilities.setCapability("apppackage", "com.cntaiping.tpl.tptb");
desiredCapabilities.setCapability("appActivity", "com.cntaiping.life.tptb.main.ui.MainActivity");
desiredCapabilities.setCapability("ensureWebviewsHavePages", true);
desiredCapabilities.setCapability("noReset", true);
URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(remoteUrl, desiredCapabilities);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
@AfterTest //测试后执行的test,关闭app
public void tearDown() throws InterruptedException {
Thread.sleep(5000);
driver.quit();
(2)对需要用到显式等待的操作进行二次封装后可在用例层直接使用
隐式等待只能等待元素存在,条件更高的需要用到硬性等待或显式等待,但是显式等待不是针对全局的,每个元素都需要加显式等待。通过二次封装将封装或的显式等待结合操作再封装一次,再用例中可直接调用,这样在二次封装的操作相当于已经包含了显式等待。
结合显式等待的操作:click,sendkeys,gettext,isdisplayed
案例:
public void inputtext(String locatename,By by,String data){
try {
waitelementvisit(by).sendKeys(data);
logger.info(locatename+"输入:"+data);
} catch (Exception e) {
logger.error("===自动化脚本执行异常===");
logger.error(e);
}
}
public WebElement waitelementvisit(By by){
WebDriverWait webDriverWait=new WebDriverWait(LemonBasicTest.driver,5);
return webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(by));
}
(3)对代码较多的操作进行二次封装后可在用例层直接使用
二次封装的操作:按键操作,滑动操作,随机数操作等
public void keycode(AndroidKey androidKey){
try {
KeyEvent keyEvent=new KeyEvent();
keyEvent.withKey(androidKey);
driver.pressKey(keyEvent);
logger.info("返回上一级");
} catch (Exception e) {
logger.error(e);
}
}
(4)在基础层中的每一个操作加日志,便于得到自动化代码的每一步操作,如上
2.page层
(1)一个测试用例一个page,每个page文件需要先继承基础层里二次封装的方法。
(2)编写页面操作代码
By loclookanswer=MobileBy.id("com.lemon.lemonban:id/switch_button");
public void lookanswer(){
click("查看答案",loclookanswer); //click经过基础层的二次封装,二次封装的方法中包含显式等待
}
3.用例层
(1)一个测试用例一个page,每个page文件需要先继承基础层里二次封装的方法和用例前置和后置的test。
(2)每个用例相互独立,所以需要有用例执行前的前置test,执行完前置操作(比如登录),才能执行用例的操作
@BeforeClass
public void beforeTiku(){
IndexPage indexPage=new IndexPage();
indexPage.myLemon();
LemonLoginPage lemonLoginPage=new LemonLoginPage();
lemonLoginPage.entrelogin();
lemonLoginPage.login("13039012776","012776");
}
(2)@Test注释和@DataProvider数据驱动(数据量较少的可以用)
@Test(dataProvider = "datapro")
public void logintest1(String mobile,String pwd,String toasttext){
LemonLoginPage lemonLoginPage=new LemonLoginPage();
lemonLoginPage.login(mobile,pwd);
String excepttoast=toasttext;
String actualtoast= lemonLoginPage.loginfailtoast(toasttext);
Assert.assertEquals(excepttoast,actualtoast);
}
@DataProvider
public Object[][] datapro(){
Object[][] data={
{"1303901277","012776","手机号码格式不正确"},
{"","012776","手机号码或密码不能为空"},
{"13039012776","","手机号码或密码不能为空"}
};
return data;
}
三.xml文件
1.resources-create testng xml,xml文件CTRL+alt+L

2.在test下一行加入parameter(如果用例中的一个属性只需要一个属性值,可以把属性值通过xml的parameter进行数据驱动)
<parameter name="platformName" value="Android"/>
<parameter name="platfomVersion" value="10"/>
<parameter name="deviceName" value="HUAWEI P40"/>
<parameter name="appPackage" value="com.lemon.lemonban"/>
<parameter name="appActivity" value="com.lemon.lemonban.activity.WelcomeActivity"/>
<parameter name="remoteUrl" value="http://localhost:4723/wd/hub"/>
@BeforeTest
@Parameters({"platformName","platfomVersion","deviceName","appPackage","appActivity","remoteUrl"})
public AndroidDriver openapp(String platformName,String platformVersion,String deviceName,String appPackage,String appActivity,String remoteUrl) {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("platformName", platformName);
desiredCapabilities.setCapability("platfomVersion", platformVersion);
desiredCapabilities.setCapability("deviceName", deviceName);
desiredCapabilities.setCapability("appPackage", appPackage);
desiredCapabilities.setCapability("appActivity", appActivity);
3.在classes里加入需要执行的用例
<class name="apptest.lemonapp.testcase.LemonLoginTest">
</class>
<class name="apptest.lemonapp.testcase.TikuEntreTest">
</class>
四.集成
1.日志
https://www.cnblogs.com/scarlettlie/articles/14829009.html
(1)引入log4j依赖
(2)创建log.properties文件
(3)日志使用:在基础层中的每一个操作加日志,可打印出自动化代码的每一步操作
2.生成allure报告
https://www.cnblogs.com/scarlettlie/articles/14829074.html
(1)在pom.xml引入allure依赖
(2)在pom.xml中编码设置避免乱码
(3)在pom.xml中引入生成allure报表的插件
(4)用mvn test构建测试
(5)mvn命令生成allure报表:mvn io.qameta.allure:allure-maven:serve
3.Jenkins集成
app自动化设计的更多相关文章
- App 自动化框架设计思路
最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...
- App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...
- APP自动化框架LazyAndroid使用手册(2)--元素自动抓取
作者:黄书力 概述 前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法. ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- iOS设计 - 一款APP从设计稿到切图过程概述
这篇文章站在GUI设计师的角度概述了APP从项目启动到切片输出的过程,相当于工作流程的介绍.这里写的不是一种规范,只是一种工作方法,加上技术的更新是非常快的,大家在具体工作中,一定要灵活运用. 这里我 ...
- app后端设计--总目录 (转)
特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...
- 【转】App架构设计经验谈:接口的设计
App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用REST ...
- app后端设计(12)--图片的处理
app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...
- APP UI设计及切图规范
APP UI设计及切图规范 1.概述 1.1 编写目的 该文档主要针对移动端开发的视觉设计和开发过程中的工作环节做统一的规划规范,是系统进入UI设计的前置文档.部分内容来自网络收集修编,转载请注明由 ...
- 26款能够吸引用户的 iPhone App 界面设计
在这个移动互联网告诉的时代,众多的移动应用程序涌现出来.谁能抓住用户的注意力,谁就有可能成功.在下面这些移动 App 界面设计中,你可以看到不同创意类型的视觉效果,让你获得灵感. 您可能感兴趣的相关文 ...
随机推荐
- mysql 使用 ibd 恢复数据
分四步: 1. 按照ibd对应的表结构,创建新表: 2. 执行: ALTER TABLE `t_健忘就多写博客` DISCARD TABLESPACE; 或者 停止mysql服务后,删除对应的 xxx ...
- Winform-耗时操作导致界面渲染滞后
原因: 某些耗时操作阻塞了主线程. 理解上述原因,需先搞清楚Winform线程机制.主要有以下2点特性:1.单线程模型:2.依赖消息循环. 1.单线程模型 Winform 默认是单线程.通常,所有的U ...
- Python实战:为Prometheus开发自定义Exporter
Python实战:为Prometheus开发自定义Exporter 在当今的微服务架构和容器化部署环境中,监控系统的重要性不言而喻.Prometheus作为一款开源的系统监控和警报工具,以其强大的功能 ...
- Yarn提交Flink任务参数介绍
一.参数介绍 作业模式:yarn-per-job 基本参数 描述 -ynm(Custom Yarnname) 自定义的Yarn名字 -yqu 指定Yarn队列名 -yn (TaskManager) ...
- C#/.NET/.NET Core优秀项目和框架2025年1月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...
- 在线客服的独立产品之路:如何将复杂的 .NET 系统打包到 Docker 镜像,使之能一键上线
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营 ...
- 如何配置支付宝密钥之如何配置普通 RSA2 密钥|保姆级教学(一)
进行支付宝开发的第一步就是:配置密钥. 但是有很多小伙伴都不知道怎么配置,这篇文章将手把手帮你从头开始捋清如何配置支付宝密钥- 这次首先放一下官方文档:[如何生成及配置 RSA2 密钥],大佬们也可以 ...
- NET中三种主机简单理解
在NET中有三个不同的主机: .NET WebApplication 主机,也称为最小主机. 这是.NET 6中的一个新特性,旨在提供最小的启动时间和内存消耗.最小主机只包括.NET运行时的最基本组件 ...
- QT5笔记: 25. 非模态的自定义对话框
窗口对象为QDialog 显示方法为 show(); locateCell->show(); 可以通过public方法或者信号槽机制获取非模态窗口的信息 例子:非模态窗口,为主窗口数据输入吧 v ...
- 数据挖掘 | 数据隐私(4) | 差分隐私 | 差分隐私概论(下)(Intro to Differential Privacy 2)
L4-Intro to Differential Privacy 拉普拉斯机制(Laplace Mechanism) 上一节课中,我们讨论了随机响应,这是一种适合于单个位的隐私化.这种算法一般来说并不 ...