一.在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自动化设计的更多相关文章

  1. App 自动化框架设计思路

    最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...

  2. App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...

  3. APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

    作者:黄书力 概述 前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法. ...

  4. Android App的设计架构:MVC,MVP,MVVM与架构经验谈

    相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...

  5. iOS设计 - 一款APP从设计稿到切图过程概述

    这篇文章站在GUI设计师的角度概述了APP从项目启动到切片输出的过程,相当于工作流程的介绍.这里写的不是一种规范,只是一种工作方法,加上技术的更新是非常快的,大家在具体工作中,一定要灵活运用. 这里我 ...

  6. app后端设计--总目录 (转)

    特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计( ...

  7. 【转】App架构设计经验谈:接口的设计

    App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用REST ...

  8. app后端设计(12)--图片的处理

    app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)—api( ...

  9. APP UI设计及切图规范

    APP UI设计及切图规范 1.概述 1.1 编写目的 该文档主要针对移动端开发的视觉设计和开发过程中的工作环节做统一的规划规范,是系统进入UI设计的前置文档.部分内容来自网络收集修编,转载请注明由 ...

  10. 26款能够吸引用户的 iPhone App 界面设计

    在这个移动互联网告诉的时代,众多的移动应用程序涌现出来.谁能抓住用户的注意力,谁就有可能成功.在下面这些移动 App 界面设计中,你可以看到不同创意类型的视觉效果,让你获得灵感. 您可能感兴趣的相关文 ...

随机推荐

  1. Linux mint安装外部软件

    //更新系统  sudo apt-get update更新ruanjian sudo apt-get upgrade更新系统 //安装浏览器 sudo apt-get install chromium ...

  2. flutter-延时执行

    //1秒后这个i行 Future.delayed(Duration(milliseconds: 1000), () { //代码省略 });

  3. 简单编写Makefile与使用make工具

    简单编写Makefile与使用make工具 在不使用make工具下对c文件的编译 gcc main.c -o out gcc <目标文件> -o <生成执行文件> 编译到执行文 ...

  4. 使用vscode开发微信小程序

    1. 安装插件 2. 文件-打开文件夹-将新建的微信小程序导入,代码会有高亮的效果 3. 编辑内容,查看效果,如果有就说明插件引入成功.

  5. 微信小程序之java服务端获取openid

    微信小程序越来越热,最近团队写了一个小程序,这篇博客我将讲一下怎么通过java服务端获取到用户的openid. api文档的授权登陆地址: http://developers.weixin.qq.co ...

  6. 【Unity】URP中的UGUIShader实现

    [Unity]URP 中的 UGUIShader 实现 参考官方 Shader 代码实现: https://github.com/TwoTailsGames/Unity-Built-in-Shader ...

  7. Deepseek学习随笔(9)--- 清华大学发布Deepseek赋能职场(附网盘链接)

    作为一名职场人,在工作中常常面临效率瓶颈:如何快速生成高质量内容?如何高效处理复杂任务?这些问题在接触了<清华大学-DeepSeek赋能职场>这份文档后,得到了全新的解答.这份由清华大学新 ...

  8. AGC015D题解

    简要题意 给定一个区间 \([l,r]\),从中选出若干整数按位或,求可能出现的数的方案数. 数据范围:\(1\le l\le r\le2^{60}\). 思路 首先对于 \([l,r]\) 里的数全 ...

  9. STM32实战——DHT11温湿度获取并展示

    介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,包括一个电阻式感湿元件和一个NTC测温元件,可以用来测量温度和湿度. 硬件连线 注意 本实验使用STM32F103C8T ...

  10. 红日复现为什么失败之struct-046流量分析加msf特征总结

    struts2漏洞 一.指纹识别 s2的url路径组成(详见struts.xml配置文件):name工程名+namespace命名空间+atcion名称+extends拓展名 部署在根目录下,工程名可 ...