Android应用测试开发——准备篇

背景

编写完代码之后,我们通常会测试自己的代码。然而大部分的我们尤其是对Android来说,都仅仅是跑过自己的代码然后看看功能看起来正常之后就算自测了。

当我们做了大量的重复的简单的动作的时候,是不是应该想想怎么让机器实现这些操作呢?为什么我们不编写一些测试代码的代码——测试用例呢?很多的Android开发者都不会写或者很少写测试用例,自己现在工作的环境也没有让写单元测试,所以自己这一方面的技能也是缺失的。因此这里准备开一个坑。把Android应用测试这一块的技能彻底补上。

测试类型

在Android上的测试类型有两种,一种是本地单元测试,测试工程放在src/test目录下,基于JVM,另一种就是设备测试,用来Android设备来
执行测试用例。


Android应用测试开发——准备篇_第1张图片
test-types.png
单元测试

开发过程中,用来测试项目中各个单元模块的功能是否正常等。通常我们使用JUnit来进行单元测试。

本地测试

基于JVM,不用编译成apk,直接用来跑单元测试,适用于不需要Android的FragmeWork依赖的情形或者使用mock的Android Framenwork依赖。

设备测试

当模拟对象不能满足我们的测试用例时,我们可以将测试代码写到androidTest中,通过真实的设备或者模拟器来测试我们的代码。

集成测试

用来测试所有的单元集成的功能是否正常。我们可以使用Espresso来进行App组件的测试,使用UI Automator来进行跨app组件的测试。

测试API

JUnit

@Before:
使用此注解指定包含测试设置操作的代码块。测试类调用每个测试之前该代码块。你可以有多种@Before方法,但在测试类调用这些方法不能保证的顺序。

@After:
该注解指定包含测试拆除操作的代码块。测试类调用每个测试方法后,这个代码块。您可以定义多个@After在您的测试代码操作。使用此批注从内存中释放的任何资源。

@Test:
标记的测试方法。单个测试类可以包含多个测试方法。

@Rule:
规则,您可以灵活地添加或重新定义的可重复使用的方式,每个测试方法的行为。在Android的测试,与Android的测试支持库提供的测试规则类,如一个共同使用此注解ActivityTestRule 或ServiceTestRule。

@BeforeClass:
标记一个静态的方法,这个方法只能被调用一次。适用于代价比较高初始化操作,例如数据库连接。

@AfterClass:
标记该静态方法只能在测试用例执行完成之后调用。适合用于释放分配的资源
@Test(timeout=):
指定测试超时时间。如果测试启动,但给定的超时期限内没有完成,它会自动失败。单位毫秒,例如:@Test(timeout=5000)。

测试支持库

  1. AndroidJUnitRunner
    在Android上兼容JUnit4的测试运行类
  2. Espresso
    UI测试框架, 适合应用内部的功能UI测试。
  3. UI Automator
    UI测试框架,适合跨应用组件的测试。

Monkey and monkeyrunner

Android SDK提供的两个功能级的测试工具。

  1. Monkey
    压力测试,又称冒烟测试。可以通过Monkey工具,使用ADB连接设备,执行Monkey命令,来对App进行压力测试。用于检测App的稳定性很有用。可以多次使用相同的随机数种子运行该工具重复事件流。
adb shell monkey -p <包名> --throttle<操作延迟> --s <随机种子> --pct-touch 50 --pct-motion 50 -v -v 1000 >c:\monkey.txt
  1. monkeyrunner
    该工具的API和运行的环境是由python编写的。我们可以写一个量大面广,功能强大,复杂的测试,然后用命令行工具来测试。

总结

有人说开发的时间已经够紧张了,为什么还要编写测试用例呢?虽然自己还没有亲自体验过编写的测试用例带来的好处(因为之前没写过),但听好多的大牛说编写测试用例并不会占用你开发的时间,反而可能缩短你开发的时间,而且你编写出来的代码质量会更高,而且重构的成本也会非常小。甚至都有一种开发模式叫做测试驱动开发(TDD)。总体来说还是利大于弊的。

你可能感兴趣的:(Android应用测试开发——准备篇)