一、介绍准备

http://blog.csdn.net/niubitianping/article/details/52626235 之前在这篇文章有写过一个例子,但是这个例子只实现了登录功能,封装还是不好的,也不能多个用例执行,现在来用上一篇文章封装之后的方法来写实例。封装和例子代码已打包在底部有链接

测试app: 守护2.2.4
appium: 1.4.16
os: win10
android: 小米note,android6.0

二、重写登录用例

1. 确定流程

打开app,到达欢迎界面,点击登录,输入帐号密码,登录,判断是否登录成功。

逻辑注意点:

  • 第一次打开会弹出引导页面,这个页面是另一个Activity:AboutActivity
  • 已经登录过了,就会直接到首页
  • 第一次到首页,会有一个dialog,这个会挡住首页

2. 编写page

在pages目录下新建LoginPage.java,继承PageAppium,实现登录的界面的控件获取和存放id值

package com.example.pages;import com.example.base.PageAppium;import java.util.List;import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;/*** ui界面类,界面在这里处理* Created by LITP on 2016/9/22.*/
public class LoginPage extends PageAppium {//登录界面的登录按钮public final String LOGIN_BUTTON_ID = "login_btn_login";//第一屏的登录按钮public final String WELCOME_LOGIN_BUTTON_ID = "welcome_login_btn";//成功登录到首页标识public final String INDEX_TEXT = "首页";//是否在关于屏标识public final String ABOUT_TEXT = "AboutActivity";//关于页面的按钮idpublic final String ABOUT_BUTTON_ID = "about_go_button";//帐号密码控件public final String NAME_PASS_ELEMENT = "android.widget.EditText";//首页控件public final String INDEX_ELEMENT = "tl_index";//登录完成之后的activity名字public final String INDEX_ACTIVITY_NAME = "IndexActivity";public LoginPage(AndroidDriver driver){super(driver);}/*** 是否在欢迎界面*/public boolean isWelcome(){return isIdElementExist(WELCOME_LOGIN_BUTTON_ID,3,true);}/*** 获取关于界面的activity的名字* @return*/public String getAboutText(){return ABOUT_TEXT;}/*** 获取关于界面的按钮* @return*/public AndroidElement getAboutButton(){return waitAutoById(ABOUT_BUTTON_ID);}public AndroidElement getWelcmoeLoginButton(){return findById(WELCOME_LOGIN_BUTTON_ID);}public AndroidElement getLoginButton(){return findById(LOGIN_BUTTON_ID);}/*** 获取账号密码框的控件* @return*/public List<AndroidElement> getNamePassElement(){return getManyElementByClassName(NAME_PASS_ELEMENT,2);}/*** 首页标识,是否成功登录* @return*/public boolean getIndexflag(){/*AndroidElement element =  waitAutoByXp(LoginPage.INDEX_TEXT);return  element != null;*/AndroidElement element = findById(INDEX_ELEMENT);return element != null;}/*** 获取首页的一个元素,让操作程序等待*/public String getIndexElementId(){return INDEX_ELEMENT;}/*** 获取首页的一个元素,让操作程序等待*/public AndroidElement getIndexElement(){return findById(INDEX_ELEMENT);}public String getIndexActivity(){return INDEX_ACTIVITY_NAME;}}

3. 编写用例

在cases目录下新建Login.java,继承InitAppium,实现用例的初始化操作

package com.example.cases;import com.example.base.Assertion;
import com.example.base.InitAppium;
import com.example.operation.LoginOperate;import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;/*** 登录测试用例* Created by LITP on 2016/9/22.*/public class Login extends InitAppium {private LoginOperate loginOperate;@BeforeClasspublic void initDriver(){Assert.assertNotNull(driver);loginOperate = new LoginOperate(driver);}/*** 测试帐号对 密码不对情况*/@Test(priority = 0)public void loginErrorUser(){boolean flag = loginOperate.login("13192624740","iuhihj");Assertion.verifyEquals(flag,true,"帐号对密码错误是否登录成功");print("帐号密码不对情况登录:"+ flag);}/*** 测试帐号密码规格不对情况*/@Test(priority = 1)public void loginErrorNum(){boolean flag = loginOperate.login("1319262asdfsddsasdfsdfsdfsdfsdfsdf4740","dfgd#@$1234fgdsfgdsgdffds");Assertion.verifyEquals(flag,true,"帐号密码格式不对是否登录成功");print("帐号密码格式不对情况登录:"+ flag);}/*** 测试帐号密码为中文情况*/@Test(priority = 2)public void loginChinese(){boolean flag = loginOperate.login("帐号","密码");Assertion.verifyEquals(flag,true,"帐号密码为中文是否登录成功");print("帐号密码为中文情况登录:"+ flag);}/*** 测试帐号密码为空情况*/@Test(priority = 3)public void loginEmpty(){boolean flag = loginOperate.login("","");Assertion.verifyEquals(flag,true,"帐号密码为空是否登录成功");print("帐号密码为空情况登录:"+ flag);}/*** 测试帐号密码正确情况*/@Test(priority = 4)public void loginConfim() {boolean flag = loginOperate.login("13192624740","xxxxxx");print("帐号密码对的情况登录:"+ flag);Assert.assertTrue(flag,"帐号密码对的情况登录");}}

4. 编写逻辑operate

实现用例的登录逻辑,继承OperateAppium

package com.example.operation;import com.example.base.OperateAppium;
import com.example.pages.LoginPage;import io.appium.java_client.android.AndroidDriver;/*** 登录逻辑处理* Created by LITP on 2016/9/23.*/public class LoginOperate extends OperateAppium {private LoginPage loginPage;AndroidDriver driver;public LoginOperate(AndroidDriver driver){super(driver);loginPage = new LoginPage(driver);this.driver = driver;}/*** 传递帐号密码* @param name 帐号* @param pass 密码* @return 是否成功登录到主页*/public boolean login(String name,String pass){sleep(1000);//是否在欢迎页面if(getCurrActivity().equals(loginPage.getAboutText())){print("关于界面");for(int i=0; i<4; i++){swipeToLeft(300);sleep(500);}clickView(loginPage.getAboutButton());//点击欢迎页面的登录clickView(loginPage.getWelcmoeLoginButton());//在欢迎界面}else if(loginPage.isWelcome()){print("点击登录");clickView(loginPage.getWelcmoeLoginButton());}else if(loginPage.getLoginButton() == null){//自动登录了就输出成功,返回print("自动登录了,返回,执行注销");return true;}//输入内容inputManyText(name,pass);//点击登录clickView(loginPage.getLoginButton());//等待到首页waitAutoById(loginPage.getIndexElementId());//如果在登录完的界面没有第一屏就点击一下中间,关闭引导屏if(loginPage.getIndexElement() == null &&getCurrActivity().equals(loginPage.getIndexActivity())){press();}//返回是否成功到主页return loginPage.getIndexflag();}}

5. 运行的xml

在这个测试module根目录下创建testng_login.xml文件,输入下面的内容右键run运行就是运行用例了,不懂的看之前的文章

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" > <!--parallel="true"  并行--><test name="Test" ><classes><class name="com.example.cases.Login" /></classes></test>
</suite>

三、修改资料用例

这个我打包了,最重要的一点就是修改用户资料之前得先调用 正确的帐号密码登录

    @Testpublic void Login() {//这里先登录,boolean flag = loginOperate.login("13192624740", "xxxxxx");//断言是否成功登录,登录成功才修改资料Assert.assertTrue(flag);}

四、测试报告ReportNg

testng自身带有测试报告,但是内容难以观看理解,所以这里利用了ReportNg

1. 导入jar包

这个包是经过修改的,支持中文,放到测试的module的libs文件夹,右键add as library,不懂的看前面的文章。

再在gradle的dependencies里面添加两个包:

    compile 'com.google.inject:guice:4.1.0'compile 'org.anarres.gradle:gradle-velocity-plugin:1.0.7'

2. 添加监听器

修改刚刚的testng_login.xml ,添加了listeners,再次运行这个xml,在module目录下就会看到有test-output测试报告的文件夹,有html和xml格式的

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" > <!--parallel="true"  并行--><test name="Test" ><classes><class name="com.example.cases.Login" /></classes><listeners><listener class-name="org.uncommons.reportng.HTMLReporter" /><listener class-name="org.uncommons.reportng.JUnitXMLReporter" /></listeners></test><!--Test-->
</suite><!--Suite-->

3. 查看测试报告

在index.html右击选择浏览器打开

封装和demo打包下载: http://download.csdn.net/detail/niubitianping/9647551

[Android测试] AS+Appium+Java+Win 自动化测试之九:PO模式的实例与ReportNg测试报告相关推荐

  1. java appium_Android应用开发之AS+Appium+Java+Win自动化测试之Appium的Java测试脚本封装(Android测试)...

    本文将带你了解Android应用开发AS+Appium+Java+Win自动化测试之Appium的Java测试脚本封装(Android测试),希望本文对大家学Android有所帮助. 一.为什么需要封 ...

  2. Appium+Python安卓自动化测试之启动APP和配置获取

    Appium+Python安卓自动化测试之启动APP和配置获取 本文章未讲述appium+python环境部署,环境部署会新开文章 一.手机连接电脑 1.USB连接电脑和手机,手机上点确认连接(最好用 ...

  3. 提升之路--从0开始学web自动化(7)--ui自动化框架搭建PO模式

    ui自动化测试在整个测试过程中占据的地位 在一个项目的测试中手工测试(60%)/自动化测试(40%),不同公司的定义不同.总体是手工占大部分 而自动化测试中,接口自动化占据70% ui自动化测试优先实 ...

  4. android测试篇(三)单元测试之UI测试 Espresso学习与实践

    前言 上一章并没有说仪器化测试,仪器化测试存放在src/androidTest目录中,仪器化测试即UI测试. 本文并没有多加理解,按照Android UI 测试指南之 Espresso抄袭(会标注转载 ...

  5. Appium移动端自动化测试之元素定位(三)

    1.name定位 driver.find_element_by_id('com.shanjian.originaldesign:id/edit_Tel').send_keys('15817252876 ...

  6. Web UI自动化测试之Selenium工具篇

    本文大纲截图: 一.自动化测试介绍 1.基本介绍 1.1 自动化 概念: 由机器设备代替人工自动完成指定目标的过程 优点: 1)减少人工劳动力 2)提高工作效率 3)产品规格统一标准 4)规模化(批量 ...

  7. android+省电程序,Android5.1 系统之省电模式探索一启动流程

    文章主要参考网址:http://www.th7.cn/Program/Android/201509/577840.shtml android5.1 省电模式开启位置: 设置--电池--节电助手(充电状 ...

  8. Appium+java+Android 四(appium实现自动化发朋友圈用例)

    上一篇博客我给大家分享了运用appium+java+android实现自动化发微信的测试用例,今天我再给大家分享一下自动化发朋友圈的测试用例吧,由于基本原理都一样,所以只把代码贴出来,如果有疑问的话, ...

  9. appium java类库下载_Appium移动自动化测试之Java篇

    2.新建一个java project,[File]-->[New]-->[Project],[Java Project]-->[Next],输入工程名称Appium,点击[Finis ...

最新文章

  1. 11月下旬国内域名解析商Top10:中国数据5.03%居第四
  2. WinForm(C#)CheckedlistBox绑定数据,并获得选中的值(ValueMember)和显示文本(DisplayMember...
  3. opencv图像灰化_opencv读入图像、灰度化、归一化、向量化
  4. jQuery和MooTools的真正区别
  5. javaWeb项目部署至tomcat下classes文件夹没有内容
  6. j计算机专业英语题库,计算机专业英语单词习题
  7. 旋转卡壳 背诵用模板
  8. 零基础带你学习MySQL—多表查询笛卡尔集(二十)
  9. 收藏=学会 前端小程序开源项目121个
  10. 软件测试好书推荐《自动化测试实践》30个项目测试案例分析
  11. 太平洋服务器cpu型号,Intel正式发布:新一代6W的超低功耗平台CPU
  12. 读研,选择高校 or 研究所?
  13. .c与.cpp的区别解析
  14. 程序员接私单操作流程。
  15. Google I/O 大会强势回归!2021 中文直播全攻略看这里
  16. 学习Linux内核内存管理要看的布局图
  17. 如何训练一个通用人工智能
  18. Ubuntu在线安装NFS服务
  19. 情人节主题的公众号图文排版怎样设计最走心?
  20. [KDD 2022]ROLAND Graph Learning Framework for Dynamic Graphs

热门文章

  1. Vue中常用的8种v指令
  2. 树脂材料激光打标原理
  3. 1602显示屏的使用
  4. 总听说网站被DDoS攻击,损失惨重,那DDos攻击到底是什么
  5. 【线性代数】---相似矩阵
  6. 办公套件新选择 WPS Office for Mac vs. 微软 Office 2019
  7. 微信运动修改器python代码
  8. to B变道to C,优信二手车的下一阶段怎么跑?
  9. truetype字体怎么转换成普通字体_如何创建自己的字体和编辑TrueType字体 | MOS86
  10. 谈判技巧——谈判阶段