使用 CTS 框架执行 instrumentation 类型的用例有很多好处,因为 CTS 框架自带很多光环,比如支持多机并行执行测试,多机分布式执行测试,出错自动截图,出错自动保存 log,可以很方便地指定测试包、类、方法,自动重跑失败用例,并附赠精美测试报告等等诸多好处,以前我们用 junit,用 testng,很多东西需要自己实现,其实 CTS 已经都给你集成了。这里简单讲讲怎么用 CTS 框架来执行自定义的用例。
1.第三方 apk 的测试
这里用 Robotium 官方万年不变的 NotePad 例子
新建一个 xml 文件,名字随便写,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<TestPackage appNameSpace="com.jayway.test" appPackageName="com.robotium" name="NotePadTest" runner="android.test.InstrumentationTestRunner" targetBinaryName="NotePad" version="1.0">
<TestSuite name="com">
<TestSuite name="robotium">
<TestSuite name="test">
<TestCase name="NotePadTest">
<Test name="testAddNote" />
<Test name="testEditNote" />
<Test name="testRemoveNote" />
</TestCase>
</TestSuite>
</TestSuite>
</TestSuite>
</TestPackage>

看下这格式就知道怎么配置了,简单解释下:
appNameSpace 是测试包的包名
appPackageName 可以随便写,这个也是你在 CTS 里用 list packages 命令看到的测试 package 名字,指定包名运行时就是靠这个
name 是测试包的文件名
runner 用默认的 InstrumentationTestRunner
targetBinaryName 是被测试包的文件名
下面的 TestSuite、TestCase、Test name 看 NotePadTest 源码目录:

很简单一目了然,TestSuite 就是源码的包名一层层嵌套下来,TestCase 就是源码的测试类的类名,Test name 就是测试类里面的方法名
把这个 xml 文件和编译出来的 NotePad.apk,NotePadTest.apk 一共 3 个文件扔到 android-cts/repository/testcases 下
下面开始运行:
首先用 list packages 看下可测的包:

可以看到我们自定义的测试包了
运行测试:

run cts -p com.robotium

测试完成:

打开报告看一眼:

很好,打完收工。
什么?没说完?UIAutomator2 和 Espresso 还用说吗?照猫画虎就行了,随便给个 UIAutomator2 的例子,记得 runner 改成 AndroidJUnitRunner
UIAutomator2 源码见https://github.com/googlesamples/android-testing/tree/master/ui/uiautomator/BasicSample

<?xml version="1.0" encoding="UTF-8"?>
<TestPackage appNameSpace="com.example.android.testing.uiautomator.BasicSample.test" appPackageName="com.mytest" name="app-test-debug" runner="android.support.test.runner.AndroidJUnitRunner" targetBinaryName="app-test" version="1.0">
<TestSuite name="com">
<TestSuite name="example">
<TestSuite name="android">
<TestSuite name="testing">
<TestSuite name="uiautomator">
<TestSuite name="BasicSample">
<TestCase name="ChangeTextBehaviorTest">
<Test name="checkPreconditions" />
<Test name="testChangeText_sameActivity" />
<Test name="testChangeText_newActivity" />
</TestCase>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestSuite>
</TestPackage>

照样把 2 个 apk 和 xml 文件扔过去就可以启动测试了

2.系统内置应用
内置应用其实很简单,把 xml 文件里的 targetBinaryName 删掉就行了,把你的测试 apk 和 xml 文件扔过去,就可以测了,比如:

<?xml version="1.0" encoding="UTF-8"?>
<TestPackage appNameSpace="com.jayway.test" appPackageName="com.robotium" name="NotePadTest" runner="android.test.InstrumentationTestRunner" version="1.0">
<TestSuite name="com">
<TestSuite name="robotium">
<TestSuite name="test">
<TestCase name="NotePadTest">
<Test name="testAddNote" />
<Test name="testEditNote" />
<Test name="testRemoveNote" />
</TestCase>
</TestSuite>
</TestSuite>
</TestSuite>
</TestPackage>

掌握了规则,就可以写脚本自动打包、生成 xml,测试,出报告一条龙服务了。


↙↙↙阅读原文可查看相关链接,并与作者交流