Android测试:Testing Apps on Android
原文:https://developer.android.com/training/testing/index.html
测试你的App是开发过程中的重要组成部分。通过对应用程序持续的运行测试,你可以验证程序的正确性、功能和可用在发布之前。
测试还提供了以下优点:
- 快速反馈失败。
- 开发周期的早期问题检测。
- 安全地重构代码,让你优化代码而不用担心回归。
- 稳定开发速度,帮助你减少技术债务。
这里的特指测试通过代码实现的“单元”测试。所以,它可以更早、更快的帮我们发现问题,使我们的代码重构更有信心;单元测试虽然前期编写会比较耗时,但是它可以有效的代码的质量,不会导致项目后期代码充满坏味道,严重拖慢开发进度;所以,减少你技术债务。
## 资源
在Android测试库、Android平台和开源社区都提供了帮助你编写Android应用测试的工具:
#### Espesso
Espresso是android应用开发自带测试库。他是一款白盒风格的UI测试工具。UI测试就都是黑盒的么?为什么会是白盒风格。
说白盒是因为,通过Espresso编写测试调用Android控件的方式和 Android开发中是一样的。
来看一段Android开发中,Activity中编写的代码。
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
通过 R.id.edit_message
调用布局文件中输入框中的内容,并转交到另外一个Activity处理。
再来看一段 Espesso 的测试代码:
@Test
public void InputEditCase() throws InterruptedException{
onView(withId(R.id.edit_message)).perform(typeText(STRING_TO_BE_TYPED));
onView(withId(R.id.send_button)).perform(click());
onView(withId(R.id.display_message)).check(matches(isDisplayed()));
onView(withId(R.id.display_message)).check(matches(withText("hello," +STRING_TO_BE_TYPED)));
}
同样使用的是 R.id.edit_message
的定位方式来查找控件,是不是白盒?我们通常的黑盒UI自动化测试是通过UI属性查看工具(如:UIAutomatorViewer)确定元素的属性来进行定位的。Espesso不需要,你看代码就好了,准确点是看Android的布局文件的控件定义。
但是,Espesso的运行是基于 SDK 的,所以,要想运行一条用例必须在Android模拟器(或真机)上安装App,启动App,然后基于UI的操作来运行测试用例。
#### Robolectric
Robolectric是一款第三方的开源的Android单元测试框架。运行在JVM上,所以它运行速度上会比 Espesso快上很多。
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Test
public void clickingButton_shouldChangeResultsViewText() throws Exception {
MyActivity activity = Robolectric.setupActivity(MyActivity.class);
Button button = (Button) activity.findViewById(R.id.button);
TextView results = (TextView) activity.findViewById(R.id.results);
button.performClick();
assertThat(results.getText().toString()).isEqualTo("Robolectric Rocks!");
}
}
来一段官方Demo,robolectric的做法是通过实现一套JVM能运行的Android代码,然后在单元测试运行的时候去截取android相关的代码调用,然后转到他们的他们实现的代码去执行这个调用的过程。
你不明白原理也没关系,反正知道Robolectric的运行不需要你真正的打开App去执行测试,就像运行一段普通的Java代码一样。所以速度上当然就很快了。
#### AndroidJUnitRunner
AndroidJUnitRunner本质上不算是个测试工具,它只是Google基于Junit针对Anroid封装的一个测试用例运行器而已。至于它用来运行Espesso还是Uiautomator的用例都是可以的。那Robolectric呢?没看到上面的例子中Robolectric有自己的运行器叫RobolectricTestRunner
@RunWith(AndroidJUnit4.class)
public class MainActiveTest{
……
}
如果看到测试类是用 AndroidJUnit4
注释的,说明用的就是AndroidJUnitRunner运行器的。
#### 测试应用
最后,更好的编写测试用例的平台,当然是Google家的亲儿子了。器大活好不粘人!(现在才发现不是去幼儿园的车,晚了,把车门给我捍死,一个都不准下车。)
Android Studio 以简化测试为设计宗旨。 您只需完成几次点击,便可建立一个在本地 JVM 上运行的 JUnit 测试,或建立一个在设备上运行的仪器测试。
当然,您也可以通过集成测试框架来扩展测试能力,例如可以集成 Mockito 在本地单元测试中测试 Android API 调用,以及集成 Espresso 或 UI Automator 在仪器测试中演练用户交互。
您可以利用 Espresso 测试记录器自动生成 Espresso 测试。
Android测试:Testing Apps on Android的更多相关文章
- Android application testing with the Android test framework
目录(?)[-] Android automated testing 1 How to test Android applications Tip 2 Unit tests vs functional ...
- 【Android Api 翻译1】Android Texting(2)Testing Fundamentals 测试基础篇
Testing Fundamentals The Android testing framework, an integral part of the development environment, ...
- Android测试:从零开始2——local单元测试
上一篇分析了android项目的测试分类,这一篇讲local单元测试. 参考android官方文档. 测试前需要配置测试环境,新建项目后,目录下会出现app/src/test/java/文件夹,这个文 ...
- 2014 非常好用的开源 Android 测试工具
http://www.php100.com/html/it/mobile/2014/1015/7495.html 当前有很大的趋势是转向移动应用平台,Android 是最广泛使用的移动操作系统,201 ...
- 【Android Api 翻译2】Android Testing(1) 浅尝Android测试的奥秘
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 仅供学习和交流使用,翻译不好勿喷,请只摘除不合适的地方 Testing The Android fram ...
- Android Testing(1) 浅尝Android测试的奥秘
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 仅供学习和交流使用,翻译不好勿喷,请只摘除不合适的地方 Testing The Android fram ...
- Android测试:Fundamentals of Testing
原文地址:https://developer.android.com/training/testing/fundamentals.html 用户在不同的级别上与你的应用产生交互.从按下按钮到将信息下载 ...
- 【Android测试】【第十五节】Instrumentation——官方译文
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5482207.html 前言 前面介绍了不少Android ...
- 常见Android测试工具简介
在进行android设备测试过程中,在进行系统测试时候,往往需要关注到很多方面,导致一个崩溃或者运行一段时间自动重启或者停止的问题很多.最简单来看,影响因素就有:底层硬件设备.OS层.上层app层.另 ...
随机推荐
- 微信小程序之页面下拉刷新
如果需要给单个页面设置下拉刷新功能,不需要写在""window"对象里面,直接在 文件名称.json 里面设置即可 { "enablePullDownRefr ...
- Again Stone Game
Alice and Bob are playing a stone game. Initially there are n piles of stones and each pile contains ...
- HDU 1074 Doing Homework (状态压缩DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- Django 模板中 include 标签使用小结
include 标签允许在模板中包含其它的模板的内容. 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串. 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 { ...
- 利用JavaScript实现动态显示表格且对应改变按键的value值
插入的代码并没有符合HTML5样式,只是为了实现利用JS动态显示表格,并且按键的value值会同时发生变化的功能. <!DOCTYPE > <html > <head&g ...
- [原创]Faster R-CNN论文翻译
Faster R-CNN论文翻译 Faster R-CNN是互怼完了的好基友一起合作出来的巅峰之作,本文翻译的比例比较小,主要因为本paper是前述paper的一个简单改进,方法清晰,想法自然.什 ...
- Node.js CVE-2017-1484复现(详细步骤)
0x00 前言 早上看Sec-news安全文摘的时候,发现腾讯安全应急响应中心发表了一篇文章,Node.js CVE-2017-14849 漏洞分析(https://security.tencent. ...
- SharePoint Online 创建用户和组
前言 本文介绍如何在Office 365中创建用户和组,这里所说的用户和组,是指Office 365中的用户和组,我们可以用这里的用户登录Office 365环境,用组的概念来管理用户,而非Share ...
- 一个简单的MVC框架的实现
1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import jav ...
- 全球领先的redis客户端:SFedis
零.背景 这个客户端起源于我们一个系统的生产问题. 一.问题的发生 在我们的生产环境上发生了两次redis服务端连接数达到上限(我们配置的单节点连接数上限为8000)导致无法创建连接的情况.由于这个系 ...