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 界面设计中,你可以看到不同创意类型的视觉效果,让你获得灵感. 您可能感兴趣的相关文 ...
随机推荐
- Windows中利用任务计划执行进程守护
在Windows中除了开发专用的进程守护外,还可以利用任务计划做进程守护. 一.bat示例 tasklist | findstr "notepad" if %ERRORLEVEL% ...
- 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
在本地部署DeepSeek大模型实现联网增强的AI应用 一.前言 在本地部署大语言模型(LLM)并赋予其联网能力,是当前AI应用开发的重要方向.本文将基于Microsoft Semantic Kern ...
- Linux mint安装百度云
deb包下载 BCloud 作者官网https://github.com/XuShaohua/bcloud-packages 链接: https://pan.baidu.com/s/1hskY04G ...
- DeepSeek本地化部署超简单,比装个office还简单
一.背景 最近DeepSeek太火了,以至于每位伙伴都想尝试,都想说上几句.作为一名程序员,不仅想使用这个DeeptSeek的AI工具,还是用其做更多的事情,比如本地化部署.构建自己的知识库,或者其他 ...
- cJSON解析器总结[转载]
一. 简介 cJson 是c语言编写的一个解析器. 是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器.主要两个文件cJSON.c 和cJSON.h . 主要用来编码和解析 ...
- Powershell 调用cmd 运行exe、bat、jar文件
1. 配置路径 $nginxPath = "C:\path\to\nginx" $redisPath = "C:\path\to\redis" $ruoyiAd ...
- 2. 在Linux 当中安装 Nginx(13步) 下载&安装&启动(详细说明+附加详细截图说明)
2. 在Linux 当中安装 Nginx(13步) 下载&安装&启动(详细说明+附加详细截图说明) @ 目录 2. 在Linux 当中安装 Nginx(13步) 下载&安装&a ...
- Windows 提权-RunAs
本文通过 Google 翻译 RunAs – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 ...
- 在php类中使用函数
好久没更新了,今天复习歪麦编写php框架的文章,看到几个函数,在类中使用时,当参数需要调用类的方法时,都用数组的方式传参. 1. spl_autoload_register(array($this, ...
- WSL2 - Ubuntu 22.04使用记录
1 安装 搭配Windows Terminal使用为佳,在微软商店可下载: 然后依照官网描述即可. 命令行中运行wsl --install即可.不过由于想自行指定发行版,于是: wsl --list ...