一、前言

对于大多数的android商业项目,android开发人员大多都处于功能快速迭代的功能研发和bug修复的循环中,对功能的测试基本都交给专门的测试人员来进行测试,但是我认为,了解和学习android测试相关的技术,为核心代码编写单元测试和自动化测试还是很有必要,能够在版本发布前,代码重构时快速的回归测试,保证代码的正确运行,提高测试的效率。

对于开发人员常用的android测试技术,基本可以分为两类,一类是单元测试,一类是自动化测试。下面将分别对两类测试进行一次粗浅的介绍和分享。

二、单元测试

android中的单元测试基于JUnit,可分为本地测试和instrumented测试,在项目中对应以下两个目录:

1.module-name/src/test/java/.

该目录下的代码运行在本地JVM上,其优点是速度快,不需要设备或模拟器的支持,但是无法直接运行含有android系统API引用的测试代码。

2.module-name/src/androidTest/java/.  

该目录下的测试代码需要运行在android设备或模拟器下面,因此可以使用android系统的API,速度较慢。  

在实际开发过程中,我们应该尽量用JUnit实现本地JVM的单元测试,而项目中的代码大致可分为以下三类:

1.强依赖关系,如在Activity,Service等组件中的方法,其特点是大部分为private方法,并且与其生命周期相关,无法直接进行单元测试,可以进行Ecspreso等UI测试。

2.部分依赖,代码实现依赖注入,该类需要依赖Context等android对象的依赖,可以通过Mock或Robolectric等其它第三方框架实现JUnit单元测试或使用androidJunitRunner进行单元测试。

3.纯java代码,不存在对android库的依赖,可以进行JUnit单元测试。

android的单元测试框架,常用的有以下几个框架和工具:

1、JUnit4

2、AndroidJUnitRunner

3、Mockito

4、Espresso

5、Robolectric

关于单元测试框架的选择,可以参考如图:

自动化测试

android的自动化测试,可以使用appium来进行编写。使用appium来进行android自动化测试的编写有如下几个优点:

1、有图形化的操作界面,简单易用。

2、直接展示页面元素的层级,可以方便的找到对应控件的id。

3、可以进行操作录制,直接生成测试代码。

appium的自动化测试需要下载appium-desktop,测试代码可以使用python、java等语言进行编写(使用python需要安装python-client/使用java需要导入java-client)。

使用时,打开appium-desktop,点击启动服务器。

拉起会话器后,填写参数,必要的参数有platformName,deviceName,如果需要拉起对应app需要填写appPackage和appActivity参数。

其中deviceName可以通过命令行adb devices获取;

appPackage和appActivity有多种获取方式,包括使用adb shell pm list packages来获取包名列表,adb shell dumpsys package 包名 来获取包信息,里面有主活动的信息;也可以打开app后使用adb shell dumpsys window | findstr mCurrentFocus来获取当前应用包名和页面;如果有apk包,可以使用adb version 查找到android sdk目录,在build-tools下,使用aapt dump badging <file_path.apk> 命令来获取apk包名和活动名。

点击启动会话后,会拉起app,同时出现手机上画面的快照。在画面中点击页面中的元素,或者展开元素树,可以找到对应控件的id等属性,在编写自动化测试时,可以通过id找到对应的控件,进行操作。

使用appium-desktop有一个很便捷的能力,可以录制操作,直接产生对应的测试代码。使用时,点击开始录制,然后在边上的小屏中选中控件,在右侧进行点击或者输入等操作,完成录制后,就能产生对应的自动化测试代码。

如果是一些复杂的操作,appium提供了TouchAction来模拟界面操作,以java代码为例:

使用Appium需要引入java-client-xx.jar包,在java-client-5.0版本之前,Appium滑动使用的是swipe方法,从5.0之后,Appium已经取消swipe方法,交由TouchAction对象的方法来完成滑动操作。在java-client-5.0版本之前也有TouchAction对象,在java-client-5.0版本之后TouchAction对象的方法使用也有所变化。

使用TouchAction可实现的功能如下:

1.press短按

短按操作是通过入参元素坐标的x,y值完成的。在5.0版本之前直接入参坐标x,y值 press(int x,int y);在5.0版本开始入参是调用PointOption对象的point方法 press(PointOption.point(int x,int y))。

2.longPress长按

长按操作同样是通过入参元素坐标的x,y值完成的,长按操作比较常见的如元素拖动、元素滑动等。在5.0版本之前直接入参坐标x,y值longPress(int x,int y);在5.0版本开始入参是调用PointOption对象的point方法 longPress(PointOption.point(int x,int y))。

3.waitAction暂停

暂停等待。在5.0版本之前使用TouchAction的wait方法,入参是int类型,单位毫秒 wait(2000);在5.0版本开始,已经丢弃了wait方法,使用TouchAction的waitAction方法,入参WaitOptions对象,调用waitOptions方法的入参值是Duration.ofSeconds(1)单位是秒waitAction(WaitOptions.waitOptions(Duration.ofSeconds(1)))。

4.moveTo移动

移动到某坐标位置,与press、longPress配合一起使用。在5.0版本之前moveTo入参为坐标x,y值 moveTo(int x,int y);在5.0版本开始入参是调用PointOption对象的point方法 moveTo(PointOption.point(int x,int y))。

5.release释放

完成press短按、longPress长按、waitAction等待、moveTo移动完成操作后需要使用release方法释放

6.perform执行

调用perform方法表示要执行press短按、longPress长按、waitAction等待、moveTo移动、release释放这些操作

举例:

PointOption startPoint = PointOption.point(1200,1200);

PointOption endPointPoint = PointOption.point(1200,600);

WaitOptions waitOption = WaitOptions.waitOptions(Duration.ofSeconds(1));

new TouchAction<>(driver).longPress(startPoint).waitAction(waitOption).moveTo(endPointPoint).release().perform();

这是一个往上滑动的操作,保持x坐标的不变,y坐标减少,表示从下往上滑动。操作过程是长按--等待1S--滑动--释放--执行

另外元素坐标位置的绝对值因设备大小、分辨率不同,值会不一样(不建议直接使用坐标操作元素),所以要使用相对位置来操作,Appium提供以下方法获取元素相对坐标:

1.获取屏幕大小

int screenWidth = driver.manage().window().getSize().width;

int screenHeight = driver.manage().window().getSize().height;

2.获取元素开始坐标

WebElement element = driver.findElement(By.id("ymxh.main:id/spinner_button"));

Point p = element.getLocation();

//获取元素开始的x,y坐标

int startX = p.x;

int startY = p.y;

3.获取元素宽、高

WebElement element = driver.findElement(By.id("ymxh.main:id/spinner_button"));

//得到元素的宽、高

Dimension d = element.getSize();

int width = d.width;

int height = d.height;

4.得到元素坐标的结束坐标

//得到坐标结束坐标

int endX = startX+width;

int endY = startY+height;

5.得到元素中间坐标

//得到元素中心坐标

int centerX = (startX + endX)/2;

int centerY = (startY + endY)/2;

浅谈Android测试技术相关推荐

  1. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...

  2. 浅谈android hook技术

    前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程. ...

  3. android hook 第三方app_【MiSRC】技术分享-浅谈android hook技术

    注:本文为"小米安全中心"原创,转载请联系"小米安全中心" 前言 xposed框架 xposed,主页:http://repo.xposed.info/modu ...

  4. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

  5. android fps 垂直同步,浅谈Android流畅度

    原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...

  6. android 存储空间监控,浅谈 Android 内存监控(中)

    前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...

  7. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  8. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  9. 浅谈区块链技术应用场景

    浅谈区块链技术应用场景 摘要 一,区块链技术简介 二,区块链技术基础 1. 点对点之间传输信息的网络 2. 非对称加密技术 3. 共识机制 三,基于软件层面区块链技术应用场景 应用层 区块链技术与身份 ...

  10. 浅谈Android Architecture Components

    浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...

最新文章

  1. centos7 python3.6升级到3.7_Centos7 升级python3,解决升级后不兼容问题
  2. MobileNet V2 复现
  3. html 超链接打开Excel,计算机打开Excel超链接时提示的解决方案
  4. 移动端性能优化系列—启动速度
  5. STM32F103使用DAC功能输出正弦波
  6. 基于用户滚动应用CSS
  7. CentOS6.8下MySQL数据库忘记root密码解决方法
  8. BZOJ3506 [CQOI2014]排序机械臂
  9. 信息管理与信息系统毕业论文选题?
  10. 从BAT围剿中杀出重围,青藤云安全“第二总部”将剑指何方
  11. 超级弱口令检查工具使用简介
  12. 谈谈网络协议,常见的网络协议有那些?
  13. MySQL数据库执行Update卡死问题解决
  14. (三)lvs负载均衡详解--lvs-DR+keepalived配置
  15. 点开计算机左侧没有桌面一项,为什么,我的电脑右键点选桌面空白弹出的右键选单里面没有了“萤幕解析度”一项啊?怎么添加回来啊急!1...
  16. 科学绘图软件 Prism 安装教程
  17. 计算机组装与维护集体备课,浅谈集体备课
  18. word2013插入excel对象报错_Excel2013中插入对象文件的方法
  19. jqgrid表格最右侧空出一截问题
  20. VMware Workstation 16 Pro及Centos 7 x86-64 iso镜像 安装 激活 使用 及 解决vm安装报错eulas_agreed=1

热门文章

  1. java servlet api.jar_servlet-api.jar包下载
  2. C# BackgroundWorker
  3. Redhat7.3修改密码
  4. DLAN(UPNP)主流开源库的官网及SDK下载地址
  5. js脚本锁计算机软件,AutoJs解密工具
  6. 单相全桥逆变器带负载电流前馈的双闭环控制系统设计及仿真
  7. 三星专用计算机软件,三星PC套件Kies软件
  8. 2016版excel_想要下班直接打卡,这些Excel技巧可以帮到你
  9. OpenWrt开发必备软件模块——网络管理(CWMP、SSH、QoS、SMTP、NTP、uHTTPd)
  10. Axure RP 9.0.0.3687 正式版