Android Testing - Instrumentated Unit Tests

这里讲的Android Testing主要针android packages(application).

1. 测试框架

Testing Framework

1.1 TestCase:

跟其他流行的的Testing Framework一样,测试也分TestSuit,每个Suit有若干TestCase,每个TestCase有若干Method

1.2 TestRunner:

TestCase必须运行在某个testrunner之上。

Android支持多个TestRunner

  • InstrumentationTestRunner 继承自android.app.Instrumentation

    Instrumentation是基类.当instrumentation打开(AndroidManifest.xml有instrumentation条目)后, instrumentation会在app启动之前先实例化,然后可以检测app运行状态。
    比较土, 只支持Junit3,
    支持instrumentation方法(methods).
    Android instrumentation is a set of control methods or “hooks” in the Android system. These hooks control an Android component independently of its normal lifecycle.

  • AndroidJUnitRunner, 继承自android.app.Instrumentation
    支持Junit3, Junit4.

  • Espresso: 单个app的UI 测试

  • UI Automator: 跨app的UI测试
    其中后三个runner在Android SDK的”Android Testing Support Library”中,SDK Mgr中的名字为”Android Support Repository”.

2. 代码结构

  1. 标准方式(使用Intellij Idea / Android Studio)
    如果放到src/main/androidTest, 那么会生成2个apk,一个是<package_name>.apk, 一个是<package_name>.test.apk
    建一个AndroidTest任务,Idea会依次安装两个apk,然后执行test
  2. 直接暴力方式
    如果放到src/main/java, 就可以直接生成apk,直接安装后用am instrument执行;

3. 运行测试用例

3.1 command line运行测试用例

帮助文件for InstrumentationTestRunner and AndroidJUnitRunner

am instrument -w                                  <instrument_name>
am instrument -w -e <k>   <v>                     <instrument_name>
am instrument -w -e class org.cfig.TestSuit       <instrument_name>
am instrument -w -e class org.cfig.TestCase       <instrument_name>
am instrument -w -e class org.cfig.TestCase#test1 <instrument_name>

实例

查看安装好的instrementation:

# pm list instrumentation
instrumentation:com.android.cts.view/android.support.test.runner.AndroidJUnitRunner

可以执行

am instrument -w -e class android.view.animation.cts.AnimatorInflaterTest com.android.cts.view/android.support.test.runner.AndroidJUnitRunner

3.2 IDE运行测试用例(idea)

创建AndroidTest运行任务,可以指定package/class/method.

感谢

Max Walker 2009年写的傻瓜教程https://newcircle.com/s/post/1038/android_junit_test_example_tutorial