Android自动化测试探索

前言

通常来说,我们开发完成产品之后,都是由测试组或者是我们自己点一点,基本上没有问题了就开始上线。但是,随着时间的堆叠,一款产品的功能也越来越多。这时,我们为了保证产品的质量,就需要在每次测试时将所有的流程都走一遍。然而,对于一款庞大的产品来说这是困难又复杂的。因为我们自己手动测试需要花费大量的时间来完成主业务测试这种重复性工作。为了保证效率以及解决成本,我们就需要考虑将这些过程采用自动化测试来完成。

自动化测试介绍

何为自动化测试?自动化测试就是通过计算机将我们人工操作的动作自动完成,比如自动点击,自动填入文本等等。Android也提供了强大的自动化测试工具,那就是UIAutomator。官方介绍文档为:https://developer.android.google.cn/training/testing/ui-testing/uiautomator-testing.html#setup。

UIAutomator介绍

你可能会有疑问,这个自动化测试能完成什么内容?我来举个简单的例子:

这里写图片描述

这种登录界面就算没做过,但一定也见过。我们一般会在测试时输入用户名,密码,然后登录。那么自动化测试可以干什么呢?它可以自己输入用户名、密码,然后登录,一气呵成。你可能会觉得,就这还需要上自动化测试?NoNoNo,我这里只是举个例子,它能帮你完成任何事情。甚至是唤醒屏幕,输入图形验证码等都可以完成。

说到这里,肯定有同学已经跃跃欲试了,憋着急,慢慢来。

UIAutomator的使用

首先我们还是需要照着官方文档学习,上面已经提供过地址,将它打开。

配置

在Android的APP module中,加入以下依赖:

dependencies {...androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}

辅助工具

因为自动化测试是自动完成的,所以它需要先找到对应的View才能进行操作。然而怎么指定应该查找哪个View呢,Android提供了辅助工具uiautomatorviewer。相信很多同学对这个工具很熟悉。

这里写图片描述

它位于<android-sdk>/tools/目录下,使用命令行将其启动:

$ uiautomatorviewer

启动后找到Device Screenshot按钮,uiautomatorviewer将会通过adb开始截取手机上的界面,并开始分析View树,就像图中所示。这时随便选择一个空间,在右下角便会列出该View的一些关键信息。其中图中方框所标识的便是基本的,也是最常用的几项信息。这些信息用来在做自动化测试时给UIAutomator提供关键的查找信息。稍后便会用到。

创建测试类

我们需要专门搞一个类用来做自动化测试。如果使用的是AndroidStudio来进行开发,那么在创建工程之初,AndroidStudio会自动创建好一个Android的测试类,就像下面这样:

这里写图片描述

我们平常开发都是在main文件夹里开发,平常不会注意到另外两个文件夹androidTest以及test是做什么用的,今天你将会了解到它们是用来做什么的。

首先我们做Android测试所用的类就是位于androidTest文件夹下的那个自动创建好的类,我们将其打开:

这里写图片描述

在示例类ExampleInstrumentedTest的顶部有两个标注:

@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)

这两样是必须要配置的,Android的自动化测试框架是基于Android Testing Support Library的,它只能运行在Android4.3以上的设备,并且它需要和AndroidJUnitRunner一起工作才能完成测试。

如果是自己创建的类,那么一定要记得在类的上面添加注解:@RunWith(AndroidJUnit4.class),除此之外还需要将AndroidJUnitRunner设置为默认的TestRunner。

将AndroidJUnitRunner设置为默认的TestRunner需要在app的build.gradle文件中加入以下配置:

android {defaultConfig {testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}
}

好了,我们的测试准备工作已经完成,接下来就开始写测试执行过程了。

测试逻辑过程

这里还是使用登录页面做示例,该登录页面是由AndroidStudio模板自动生成的。

这里写图片描述

我们使用自动化测试完成的测试功能有,填入用户名、密码,然后登录。

我们需要先启动uiautomatorviewer:

这里写图片描述

启动之后的界面:

这里写图片描述

我们点击图中箭头所指的按钮,出现以下界面:

这里写图片描述

在左边的图中选择我们第一个要输入文字的EditText输入框,我们可以看到右边出现了这个View层级的属性结构以及该View的一些基本属性,在这里的的EditText的index为0,resource-id为com.sahadev.autotestforlogin:id/password,还有它是哪个类:android.widget.EditText。

得知这些基本信息之后,我们开始了解一下测试代码的执行过程:

  • 1.首先需要获得可以访问设备的上下文对象UiDevice,UiDevice的实例通过静态方法getInstance()获得,该方法需要传入一个Instrumentation对象。
  • 2.通过UiDevice的findObject()来找到UiObject,这个UiObject代表了刚刚我们指定的EditText。
  • 3.通过UiObject来模拟用户的真实操作,比如填入文本,或者点击等操作。由于这里是EditText,所以我们的工作就是填入文本,使用UiObject的setText()方法即可。

测试逻辑实现

有了以上的知识之后,我们来实现这个登录过程。

1.首先获得UiDevice对象:

mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

2.通过指定的条件查找代表EditText的UiObject:

UiObject email = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email"));

3.往EditText中写入邮箱地址:

email.setText("sahadev@foxmail.com");

好了,到这里如果执行的话,系统就会帮我们自动填入这个邮箱地址了。接下来我们的工作就是继续填入密码,然后点击登录。我们来完成剩下的代码。完整的代码如下:

package com.sahadev.autotestforlogin;import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SdkSuppress;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector;import org.junit.Before;
import org.junit.runner.RunWith;/*** Instrumentation test, which will execute on an Android device.** @see <a href="http://d.android.com/tools/testing">Testing documentation</a>*/
@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class ExampleInstrumentedTest {private UiDevice mDevice;@Beforepublic void startMainActivityFromHomeScreen() {mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());UiObject email = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email"));//填入邮箱地址email.setText("sahadev@foxmail.com");UiObject password = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/password"));//填入密码password.setText("123456");UiObject loginButton = mDevice.findObject(new UiSelector().resourceId("com.sahadev.autotestforlogin:id/email_sign_in_button"));//点击登录loginButton.click();}
}

基本的测试代码已经完成,接下来就是如何运行了。在AndroidStudio中点击运行按钮即可:

这里写图片描述

运行效果如下:

这里写图片描述

怎么样,有没有很想试一把的感觉呢?慢慢积累,它就是一个很庞大的工程了。今天的文章只是带大家入一下门,这个自动化测试工具本身很强大,可以完成很多工作。有更多的问题可以加群讨论。UIAutomator的官方介绍文档地址为:https://developer.android.google.cn/training/testing/ui-testing/uiautomator-testing.html,更多内容请点击查看。


我建了一个QQ群,欢迎对学习有兴趣的同学加入。我们可以一起探讨、深究、掌握那些我们会用到的技术,让自己不至于太落伍。
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我整理了100道大厂算法岗面试必考题!

最近&#xff0c;很多小伙伴给我留言去面试被面试官吊打了&#xff0c;尤其是一些去面大厂的朋友&#xff0c;甚至一面都没有过...来&#xff0c;别灰心&#xff0c;我以过往经验告诉你大厂面试的通关秘诀&#xff01;对&#xff0c;就是算法&#xff01;大厂面试必考算法&…

参会邀请 - ISWC2020 | 第十九届国际语义网会议

第十九届国际语义网会议&#xff08;ISWC2020&#xff09;将于11月1日至6日远程召开。国际语义网会议是全球最重要的且最有影响力的国际学术会议&#xff0c;主要聚焦语义网&#xff0c;知识图谱&#xff0c;本体&#xff0c;链接数据等面向互联网的人工智能技术。国际语义网会…

美团配送资金安全治理之对账体系建设

前言 随着美团配送业务的飞速发展&#xff0c;单量已经达到千万级别&#xff0c;同时每天产生的资金额已经超过几千万&#xff0c;清结算系统在保证线上服务稳定可靠的前提下&#xff0c;如何系统化的保障资金安全是非常核心且重要的课题&#xff0c;配送清结算系统经过近3年的…

Githug第42关rebase_onto通关秘籍

Githug是一个用来了解、熟悉Git的一个非常好的游戏。 目前网站上收录的都是之前只有55关的解题方法&#xff0c;没有新增的rebase_onto这一关的内容。现在Githug一共有56关。现将新增的42关的解答内容更新如下&#xff1a; 第42关的题目如下: Name: rebase_onto Level: 41 D…

gcc安装不行的解决办法,需更新apt-get

上面应该更新apt-get 更新之后&#xff0c;重新安装gcc成功

LeetCode 138. 复制带随机指针的链表(哈希 / 深拷贝)

1. 题目 给定一个链表&#xff0c;每个节点包含一个额外增加的随机指针&#xff0c;该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深拷贝。 《剑指Offer》同题&#xff1a;面试题35. 复杂链表的复制 2. 解题 类似题目&#xff1a;LeetCode 1484. 克隆含随…

论文浅尝 - COLING2020 | 桥接文本和知识的多原型嵌入在少样本关系三元组抽取中的研究...

本文转载自公众号&#xff1a;浙大KG。 论文题目&#xff1a;Bridging Text and Knowledge with Multi-Prototype Embedding for Few-Shot Relational Triple Extraction本文作者&#xff1a;余海阳发表会议&#xff1a;COLING 2020论文链接&#xff1a;https://person.zju.…

惊呆!不用一张图片,却训出个图像识别SOTA?

文 &#xff5c; 橙橙子如果老板派给你一个任务&#xff0c;不使用一张图片&#xff0c;让你训练一个视觉预训练模型&#xff0c;你会不会觉得老板疯了。最近有一篇论文&#xff0c;不仅没用一张真实图片和标注&#xff0c;还训练出个媲美SOTA的效果&#xff0c;甚至超过了MoCo…

LeetCode 797. 所有可能的路径(DFS)

1. 题目 给一个有 n 个结点的有向无环图&#xff0c;找到所有从 0 到 n-1 的路径并输出&#xff08;不要求按顺序&#xff09; 二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点&#xff08;译者注&#xff1a;有向图是有方向的&#xff0c;即规定…

每天数百亿用户行为数据,美团点评怎么实现秒级转化分析?

背景 用户行为分析是数据分析中非常重要的一项内容&#xff0c;在统计活跃用户&#xff0c;分析留存和转化率&#xff0c;改进产品体验、推动用户增长等领域有重要作用。美团点评每天收集的用户行为日志达到数百亿条&#xff0c;如何在海量数据集上实现对用户行为的快速灵活分析…

EventBus1.0.1源码解析

很久没有更新过源码解析类文章&#xff0c;以下内容作为源码分析类的笔记。分析方法适用于其它源码分析。 分析工具说明 许久以来&#xff0c;阅读源代码最得力的工具就非Source Insight莫属了。然&#xff0c;后来微软出了一款轻量级但功能强大的IDE就没Source Insight什么事…

pycharm插件之SonarLint

pycharm插件之SonarLint pycharm插件之SonarLint 一、插件安装位置 1、在线安装插件 通过File—>Settings—>Plugins进行安装插件&#xff0c;然后只需要重新启动IEDA即可。 2、离线安装插件 通过 Settings > Plugins > Install Plugin from 离线安装&#x…

论文浅尝 - ICLR2020 | You Can Teach an Old Dog New Tricks!关于训练知识图谱嵌入

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生。来源&#xff1a;ICLR2020链接&#xff1a;https://openreview.net/pdf?idBkxSmlBFvrKG embedding&#xff08;KGE&#xff09;模型的目标是学习知识图谱中实体和关系的向量表示。近年来众多的KGE方法被提出&#…

撑起百万亿参数模型想象力!英伟达发布新一代SuperPOD超算,AI算力新巅峰!

周一&#xff0c;黄教主又很淡定的在自家厨房里开完了GTC发布会。众所周知&#xff0c;NLP领域的模型一个比一个大&#xff0c;自从百亿参数的Google T5出来后&#xff0c;大部分AI研究者只能望着手里的蹩脚算力兴叹。如今动辄就是千亿、万亿参数模型&#xff0c;目前比较流行的…

每日优鲜小程序基础组件介绍

每日优鲜小程序基础组件介绍1.基础组件介绍2.基础组件的结构与作用3.基础组件的接入方法初次引入初始化更新与维护基础组件接入1.基础组件介绍 小程序基础组件基于每日优鲜主商城小程序业务实践演变而来。 基础组件的名称为&#xff1a;mini_app_base_module。 基础组件的项…

知识图谱入门 (八) 语义搜索

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/39237778

Redis 高负载下的中断优化

背景 2017年年初以来&#xff0c;随着Redis产品的用户量越来越大&#xff0c;接入服务越来越多&#xff0c;再加上美团点评Memcache和Redis两套缓存融合&#xff0c;Redis服务端的总体请求量从年初最开始日访问量百亿次级别上涨到高峰时段的万亿次级别&#xff0c;给运维和架构…

LeetCode 394. 字符串解码(栈)

1. 题目 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没有额外的空格&…

90TB显存!英伟达发布新一代SuperPod超算,AI算力新巅峰!

周一&#xff0c;黄教主又很淡定的在自家厨房里开完了GTC发布会众所周知&#xff0c;NLP领域的模型一个比一个大&#xff0c;自从百亿参数的Google T5出来后&#xff0c;大部分AI研究者只能望着手里的蹩脚算力兴叹。如今动辄就是千亿、万亿参数模型&#xff0c;目前比较流行的V…

VS Code HtmlFindClass 插件介绍

这款插件诞生于工作中&#xff0c;在写大量的前端代码之后&#xff0c;发现有的工作比较重复&#xff0c;浪费时间&#xff0c;于是想能不能通过工具来解决。起初是拿Java写的&#xff0c;但是它不利于推广&#xff0c;因为很多前端同学不掌握Java。以至于是一直我自己在使用。…