Android 测试 (一)--测试总览

android 测试基于 Junit,我们既可以在 JVM 运行单元测试,也可以在 Android 设备上运行功能测试

测试类型

当使用 Android studio 来写测试程序时,你的代码必须放在两个指定的文件夹中。

Local unit testsWARNING: No manifest file found at ./AndroidManifest.xml.

Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
位于 module-name/src/test/java/.
这些测试时运行在本地 JVM,没有运行 Android framework API的权限

可以参考这个

Instrumented test

Instrumented Unit test 是允许在真机或者模拟器上的,而不是运行在本地环境下的虚拟机中。如果在测试时需要使用 instrumentation information(例如 app Context),或者你需要获取 Android 框架的组件(例如 SharedPrederences),这时候你就可以创建一个 instrumented unit test。使用 Instrumented unit test 可以帮助减少编写模拟环境的代码。当然你也可以使用一些 mock 框架。使用 Instrumented unit test 可以很好的利用 Android framework api 和 supporting API。

位于 module-name/src/androidTest/java/.
测试运行在 Android 设备上或者 Android 模拟器上
在测试过程中,这些测试代码会被编译成 apk 运行在设备上。系统会将这个测试程序 和待测程序运行在同一个进程中,所以测试程序能调用待测程序的方法。

更多例子

然而,unit test和instrumented test 只是形式来帮助区分,从Android平台(硬件设备或仿真器上)上运行测试和在本地JVM上运行测试。
构建完整的测试套件的时候,你应该明白真正的测试类型如下表所述。

类型 子类型 描述
Unit tests Local Unit Tests 只在 JVM上运行,当没有 Android framework 的相关依赖,或者 mock 了这部分依赖时,这部分测试运行的会非常快
Instrumented unit tests<span class="Apple-tab-span" style="white-space:pre"></span> 这些测试运行在 Android 设备或者 Android 模拟器上。这些测试有获取 Instrumentation 信息的权限,比如获取当前的 context。当你 mock 的对象满足不了 Android 的依赖时,可以使用这个测试
Integration Tests(集成测试) 组件在一个 app 中 这种类型的测试验证目标应用程序的行为,当用户执行特定的操作,还是在进入活动特定的输入如预期。举个栗子,当用户做一些交互动作是,他可以用来验证程序返回正确的UI响应。 Espresso的UI测试框架允许你以编程方式模拟用户操作和测试复杂的内部应用程序的用户交互。
组件在不同的 app 中 这种类型的测试验证不同的用户应用程序之间或用户应用程序和系统应用之间的相互作用正确的行为。比如,当用户执行 Android 的设置菜单操作时,你可能想测试你程序的行为。此类的框架有 UI Automator

测试 API

以下都是在 Android 测试中常用的 api。

JUnit

你可以采用类似 JUnit 4 的方式来写单元测试或者集成测试。framework提供了一种很方便的方式来帮我们设置 、去除、断言

一个基本JUnit 4测试类是包含一个或多个测试方法的Java类。一种测试方法始于@Test注释,其中包含的代码验证一个单独的功能(即一个逻辑单元)

下面例子是使用Espresso APIs(UI 测试框架)的一个集成测试,用来测试点击一个 UI 组件,检查字符串得到相应的显示

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {

    @Rule
    public ActivityTestRule mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    @Test
    public void sayHello(){
        onView(withText("Say hello!")).perform(click());

        onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));
    }
}

在JUnit 4测试类,你可以通过以下注释召唤出在特殊处理你的测试代码段:

  • @Before:主要是测试代码的一些设置。每段@test 执行之前都会先执行 @Before注解 的方法。你可以有多个@Before方法,但在测试类调用这些方法不能保证的顺序。
  • @After:主要是一些释放资源的操作。每段@test 执行之后都会执行 @After注解 的方法。你可以有多个@After方法,用来释放内存中的资源
  • @Test: 表示这个方法是测试代码。每个测试类可以有多个测试方法。每个方法都要标明这个注解
  • @Rule: 可以通过 Rule 灵活的添加和重复使用测试方法。在 Android 测试中,如ActivityTestRule或ServiceTestRule(这些都在 support 包中)
  • @BeforeClass: 为每个测试类指定静态方法。每个测试类之后调用这个一次。比如连接到数据库的操作可以使用这个注解
  • @AfterClass:使用此批注指定静态方法的测试类类中的所有测试都运行之后才调用。该测试步骤是释放在@BeforeClass块分配的资源
  • @Test(timeout=): 如果测试启动,但给定的超时期限内没有完成,它会自动失败。你必须以毫秒为单位指定超时周期

更多的注解可以查看文档 junit 注解android 注解

Android Testing Support Library

Android Testing Support Library 提供了一系列 api 来帮助我们app快速构建测试代码。包括 JUnit 4 和 UI 测试。

  • AndroidJUnitRunner:一个JUnit 4兼容的测试运行为Android。
  • Espresso:一个UI测试框架;适用于应用程序内的功能UI测试。
  • UI Automator:适用于系统和安装的应用程序之间的交叉应用功能UI测试的UI测试框架。

Assertion classes

由于Android测试支持库API继承自JUnit,您可以使用断言方法来显示测试的结果。断言方法比较测试返回值和实际值,并且如果该比较测试失败抛出AssertionException。使用断言比记录更方便,并提供更好的测试性能。

为了简化测试开发,你应该使用Hamcrest库,它可以让你创建使用Hamcrest匹配器的API更加灵活的测试。

Monkey and monkeyrunner

Android SDK提供了两种功能测试工具

Monkey

这是一个命令行工具。发出按键,触摸和手势的随机流命令。可以使用ADB工具来运行它,并用它来做压力测试,汇报遇到的错误的

测试系列博客目录

翻译自(有增删 2016-11-05)

https://developer.android.com/training/testing/start/index.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容