最近接触到CTS,据传不懂CTS就不算一个合格的android开发人员,我之前一直没见周边谁用过,作为一个产品开发的android人员,我还是太年轻~
撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40650001#t11
概念:
Compatibility Test Suite (CTS) 兼容性测试组,是由google提供的一套测试框架,含有很多测试用例,
框架用于管理测试用例在真机设备或者模拟器上的执行,那些用例全是用java写的apk,通过运行这些apk得到的结果来测试系统平台的兼容性与稳定性.
Compatibility Definition Document (CDD) 一个定义标准,系统需要符合软件以及硬件相关参数.
你可以把测试结果发送给[email protected]。当你提交了一个CTS报告时,你还可以要求访问Android Market。
配置:
有android源码的可以直接在源码下 make cts ,最后会生成 /out/host/linux-x86/cts/android-cts
还可以去 http://source.android.com/compatibility/downloads.html 上面下载google提供的各个版本的 CTS组件,解压出来android-cts目录需要版本对应!
目录结构如下:
其中docs为空,
repository目录下有plans . testcases
tools 目录下就是启动 cts console 的工具包,由 cts-tradefed 脚本启动!其中有个README
网上的配置五花八门,直接看这个简单明了:
Configuring cts-tradefed ------------------------ 1. Ensure 'adb' is in your current PATH. adb can be found in the Android SDK available from http://developer.android.com Example: PATH=$PATH:/home/myuser/android-sdk-linux_x86/platform-tools 2. Follow the 'Setting up your device' steps documented in the CTS User Manual. The CTS User Manual can be downloaded at http://source.android.com/compatibility/downloads.html 3. Connect the device to the host machine. 4. Ensure device is visible via 'adb devices' Using cts-tradefed ------------------- To run a test plan on a single device: 1. Make sure you have at least one device connected 2. Launch the cts-tradefed console by running the 'cts-tradefed' script at android-cts/tools/cts-tradefed 3. Type: 'run cts --plan CTS' to run the default CTS plan Some other useful commands are To run a test package: 'run cts --package <packagename>' To run a test class: 'run cts --class <full test class name>' To shard a plan test run on multiple devices 'run cts --plan CTS --shards <number of shards> note: all connected devices must be running the same build For more options: 'run cts --help' CTS Tradefed Development ------------------------ See http://source.android.com for instructions on obtaining the Android platform source code and setting up a build environment. The source for the CTS extensions for tradefed can be found at <android source root>/cts/tools/tradefed-host The source for the tradefed framework can be found on the 'tradefed' branch. Perform these steps to build and run cts-tradefed from the development environment: cd <path to android source root> make cts cts-tradefed
google的README写的很明白了,需要终端能够使用 adb 这个在google提供的SDK中是有的,还给出来了下载链接,然后设置到环境变量PATH中!
可以看下cts-tradefed 这个脚本:
checkPath adb checkPath java # check java version JAVA_VERSION=$(java -version 2>&1 | head -n 1 | grep '[ "]1\.6[\. "$$]') if [ "${JAVA_VERSION}" == "" ]; then echo "Wrong java version. 1.6 is required." exit fi
可以看到 是需要jdk 1.6 以上的支持的!
android源码下的 cts 可能不是最新的,所以最好是去上面提到的google官网去下载对应的 cts 组件!
使用:
启动:
首先打开TV的adb调试开关,ubuntu通过adb connect TV_IP 连接,android-cts下执行cts-tradefed脚本进入cts控制台:
可以看到在cts-tf下使用 l d 命令查看到了 设备的相关信息.
命令:
使用help查看:
可以看到支持的命令集!
其中版本为4.2_r4,定义在/cts/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java 中
使用 l p 查看可测试的计划:
cts-tf > l p CTS-TF CTS VM-TF AppSecurity PDK Java Android Signature
这些都是存在 android-cts/repository/plans 下
一个plan中包含多个package ,每一次执行 run cts 都会分配一个 Session 号,从 0开始..
l d 显示连接的设备, l packages 显示可测试的包 , l r 显示记录结果
run cts -p package_name 单独测试package_name包
run cts --continue-session sessionID --disable-reboot
根据sessionID 继续进行测试,不重启 ,因为重启 adb就断掉了!
run cts -c com.class_name -m methmod_name 单独测试某个类的方法 -c 后面跟类名全路径 –m 后面跟方法名
其它命令可以看注释,不多做解释!
准备:
如果需要测试media相关的包,可在google官网下载 CTS Media 1.0 放到sdcard的test目录.
另外需要做的准备有:
安装cts测试需要的apk到目标板:CtsDelegatingAccessibilityService.apk,CtsDeviceAdmin.apk
(这两个APK可以在cts源码目录的testcase中找到)
系统setting的配置
(如果项目删除了默认的setting或者深度修改了,可以用google的原生setting替代原有的setting来进行设置)
进入settings打开Wi-Fi并连接AP (AP需要连外网)
进入settings->Security->Screenlock设为None
进入settings->Security->Deviceadministrators->Enable两个选项
进入Language&input->language设为English(UnitedStates)
进入settings->Display->Sleep设为30minutes或None
进入settings->Accessibility->EnableDelegating Accessibility Service
进入settings->Developeroptions->Enable USB debugging、Stay awake、Allowmock locations
手动设置时间,并将时区调为北京,设置国家为china
这样就可以运行 run cts * 进行测试啦!
结果:
测试完之后的结果保存在 /android-cts/repository/results/2014.10.31_11.53.42/testResult.xml 中
可以看到结果就四种:[pass/fail/notExecuted/timeout]
如果我们的硬件上并不支持某个功能模块的时候,我们可以在testResult.xml中修改 result="fail" 为 result="notExecuted"
如果是fail的肯定还有这样的附加信息:
<Test name="testPlay00" result="fail" starttime="星期五 十月 31 12:01:24 CST 2014" endtime="星期五 十月 31 12:01:26 CST 2014"> <FailedScene message="junit.framework.AssertionFailedError: playback /mnt/sdcard/test/bbb_short/176x144/3gp_h263_libfaac/bbb_short.ffmpeg.176x144.3gp.h263_300kbps_12fps.libfaac_mono_24kbps_11025Hz.3gp at android.mediastress.cts.MediaPlayerStressTest.doTestVideoPlayback(MediaPlayerStressTest.java:161) "> <StackTrace>junit.framework.AssertionFailedError: playback /mnt/sdcard/test/bbb_short/176x144/3gp_h263_libfaac/bbb_short.ffmpeg.176x144.3gp.h263_300kbps_12fps.libfaac_mono_24kbps_11025Hz.3gp at android.mediastress.cts.MediaPlayerStressTest.doTestVideoPlayback(MediaPlayerStressTest.java:161) at android.mediastress.cts.MediaPlayerStressTest.doTestVideoPlaybackShort(MediaPlayerStressTest.java:165) at android.mediastress.cts.H263QcifShortPlayerTest.testPlay00(H263QcifShortPlayerTest.java:49) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661) </StackTrace> </FailedScene> </Test>
可以看到还有堆栈信息,可用于查找定问fail原因!
添加testcase:
我们可以在源码/cts/tests/tests/下面看到所有的testcase
网上的方法,这里借用记录如下:
配置Testcase
结构如下:
example
├── AndroidManifest.xml
├── Android.mk
└── src
└── android
└── example
├── cts
步骤:
1、 在cts/tests/tests/目录下创建一个自己的用例集(文件夹)名称XXX;
2、 在该文件夹中构建如下结构:
XXX
├──AndroidManifest.xml(可以拷贝example下该文件)
├── Android.mk(可以拷贝example下该文件)
└── src
└── android
└──XXX
└── cts
3、 编写测试代码
具体操作:
在src/android/XXX/cts目录下添加自己的用例;(XXX为自己的测试用例集的名称,例如:test)
细节说明:
1、google官方cts测试用例中,对一个类进行测试时,并没有对该类的所有方法进行测试,而是测试了该类中使用最频繁的一些方法;所以我们自己编程测试用例时,也可以按照这样的原则进行操作;
2、对于“窗口控件类”中使用的的res资源文件的目录在source_android4\cts\tests\res
3、最好是在eclipse中编写,需要res文件的,可以先拷贝到当前工程下,这样可以通过eclipse检查编程中的语法错误;
4、包名的格式:package android.XXX.cts;
4、 修改XXX/目录下的Android.mk文件
LOCAL_PACKAGE_NAME:= CtsXXXTestCases(这个变量是定义自己的测试用例集的名称;编译后会生成同名的APK文件)
LOCAL_INSTRUMENTATION_FOR:= CtsTestStubs(这个变量定位的是一些涉及到虚拟机的测试用例,使用junit框架;TestStubs这个类在目录cts\tools\vm-tests-tf\src\dot\junit\opcodes下)
5、修改XXX/目录下的AndroidManifest.xml文件
<manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.cts.XXX"> <uses-permissionandroid:name="android.permission.DISABLE_KEYGUARD" /> <application> <uses-libraryandroid:name="android.test.runner" /> </application> <instrumentationandroid:name="android.test.InstrumentationCtsTestRunner" android:targetPackage="com.android.cts.stub" android:label="CTStests of android.XXX"/> </manifest>
6、修改source_android4.2/cts目录下的CtsTestCaseList.mk;(重要)
在该文件中给变量cts_test_packages追加自己测试用例集名称CtsXXXTestCases
说明:该文件在编译的时候会被build/core/tasks/cts.mk调用,生成最终的CTS包。
对CtsTestCaseList.mk文件说明:
CTS_COVERAGE_TEST_CASE_LIST(核心变量)
├── cts_support_packages(该变量包含的是测试依赖的一些用例,其对于代码目录为cts/hostsidetests)
├──CtsAccelerationTestStubs \
├──CtsDelegatingAccessibilityService \
├──CtsDeviceAdmin \
├──CtsMonkeyApp \
├──CtsMonkeyApp2 \
├──CtsSomeAccessibilityServices \
├──CtsTestStubs \
├──SignatureTest \
├──TestDeviceSetup \
├──$(cts_security_apps_list)
├── cts_test_packages(该变量对应的是cts/tests/tests/目录下的测试用例)
编译自己的cts包
执行make cts -j4
在真机上进行测试
由于完整进行cts测试要很长时间,所以我们可以自己创建一个测试计划,步骤如下:
1、将cts包解压,在android-cts\repository\plans下创建一个名为XXX的xml文件;
2、这个xml文件格式为:
<?xmlversion="1.0" encoding="UTF-8"?>
<TestPlan version="1.0">
<Entry uri="android.XXX"/>
</TestPlan>
3、进行cts测试时执行run cts -- plan XXX