使用 Android studio 分析运行CTS用例

CTS的用例其实是个大宝库,但是网络上对于这部分的介绍却很少,今天我们抛砖迎玉,先从搭建环境开始。

CTS的用例其实是个大宝库,是写单元测试的典范,研究和学习这些用例的内容不管是对Android系统的研究还是对个人的技术提升都是很有帮助的。但是网络上对于这部分的介绍却很少,都只是讲怎么运行CTS用例,没有去深究这些case到底测了什么。这里仅抛砖迎玉,我们先从搭建环境开始。

必备材料:
1.Android源代码一套
2.此套源码要完成编译过程(我这里用的是Android4.4.4的源码,使用64位ubuntu14.04发行版编译,安装了必要的依赖后直接编译完成,全程无错,无需修改任何源代码文件)

下面我们以WIFI模块的测试用例为例。
WIFI模块的测试用例在~/cts/tests/tests/net目录下,我们看下这个目录的结构:

├── AndroidManifest.xml
├── Android.mk
├── jni
│   ├── Android.mk
│   └── NativeDnsJni.c
└── src
    └── android
        └── net
            ├── cts
            │   ├── ConnectivityManagerTest.java
            │   ├── CredentialsTest.java
            │   ├── DhcpInfoTest.java
            │   ├── DnsTest.java
            │   ├── LocalServerSocketTest.java
            │   ├── LocalSocketAddress_NamespaceTest.java
            │   ├── LocalSocketAddressTest.java
            │   ├── LocalSocketTest.java
            │   ├── MailToTest.java
            │   ├── NetworkInfo_DetailedStateTest.java
            │   ├── NetworkInfo_StateTest.java
            │   ├── NetworkInfoTest.java
            │   ├── ProxyTest.java
            │   ├── SSLCertificateSocketFactoryTest.java
            │   ├── TrafficStatsTest.java
            │   ├── Uri_BuilderTest.java
            │   ├── UriTest.java
            │   ├── UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
            │   ├── UrlQuerySanitizer_ParameterValuePairTest.java
            │   ├── UrlQuerySanitizerTest.java
            │   └── VpnServiceTest.java
            ├── http
            │   └── cts
            │       ├── ApacheHttpClientTest.java
            │       ├── SslCertificate_DNameTest.java
            │       ├── SslCertificateTest.java
            │       └── SslErrorTest.java
            ├── ipv6
            │   └── cts
            │       └── PingTest.java
            ├── rtp
            │   └── cts
            │       ├── AudioCodecTest.java
            │       ├── AudioGroupTest.java
            │       └── AudioStreamTest.java
            └── wifi
                └── cts
                    ├── ConcurrencyTest.java
                    ├── NsdManagerTest.java
                    ├── ScanResultTest.java
                    ├── SupplicantStateTest.java
                    ├── WifiConfigurationTest.java
                    ├── WifiEnterpriseConfigTest.java
                    ├── WifiFeature.java
                    ├── WifiInfoTest.java
                    ├── WifiManagerTest.java
                    └── WifiManager_WifiLockTest.java

把net目录单独拷贝一份,开始动手了,可以看到net目录下还包含其他如http、ipv6等模块的用例,我们只想分析wifi模块的,其它不需要,删掉,目录结构变成这样:

├── AndroidManifest.xml
├── Android.mk
└── src
    └── android
        └── net
            └── wifi
                └── cts
                    ├── ConcurrencyTest.java
                    ├── NsdManagerTest.java
                    ├── ScanResultTest.java
                    ├── SupplicantStateTest.java
                    ├── WifiConfigurationTest.java
                    ├── WifiEnterpriseConfigTest.java
                    ├── WifiFeature.java
                    ├── WifiInfoTest.java
                    ├── WifiManagerTest.java
                    └── WifiManager_WifiLockTest.java

我们要导入Android studio进行分析,所以要稍微改造下使它像一个Android项目,我们在src下添加bin、gen、libs三个文件夹,最后变成这样:

├── AndroidManifest.xml
├── Android.mk
├── bin
├── gen
├── libs
└── src
    └── android
        └── net
            └── wifi
                └── cts
                    ├── ConcurrencyTest.java
                    ├── NsdManagerTest.java
                    ├── ScanResultTest.java
                    ├── SupplicantStateTest.java
                    ├── WifiConfigurationTest.java
                    ├── WifiEnterpriseConfigTest.java
                    ├── WifiFeature.java
                    ├── WifiInfoTest.java
                    ├── WifiManagerTest.java
                    └── WifiManager_WifiLockTest.java

很眼熟吧,没错,这就是eclipse下面的Android项目结构,只不过少了几个其他的assert,res之类的文件夹而已,但我们不想用eclipse,而分析这样的代码用gradle项目结构又很麻烦,所以下面讲如何把eclipse项目原样导入Android studio。

把eclipse项目导入Android studio:
1.file->open打开项目

 

2.打开module setting

 

3.设置project

 

4.添加source文件夹

 

5.把gen文件夹也添加进去

 

6.点一下gen最右边的P,在弹出的对话框中勾选For generated sources

 

 

7.Dependencies界面把SDK设置为19

 

8.新建一个Android

 

9.structure界面把各个文件夹设置正确,源码文件夹中没有res和assets没有关系,这里不影响

 

10.Generated Sources中设置gen目录

 

11.把4个依赖的jar包拷贝到源码libs目录下,然后在Libraries中添加依赖的jar包,WIFI模块一共依赖4个jar包,这里添加3个

 

 

说明:
3个classes开头的jar包都在编译完成的out文件夹下,这里手动改了名字而已
classes-cts.jar对应~/out/target/common/obj/JAVA_LIBRARIES/ctstestrunner_intermediates/classes.jar
classes-deviceutil.jar对应~/out/target/common/obj/JAVA_LIBRARIES/ctsdeviceutil_intermediates/classes.jar
classes-framework.jar对应~/out/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/classes.jar
junit-4.10.jar网上随便能下载到

12.在SDKs中修改Build target为19,并且把classes-framework.jar添加进来,且一定要在android.jar的前面,这是因为framework.jar中有一些系统的隐藏方法,所以要放在公用API android.jar的前面被调用

 

13.编辑Configurations

 

14.新建一个Android Tests

 

15.重命名,并选择runner为CtsTestRunner

 

16.项目-右键-开始RUN RUN RUN

 

 

17.测试结束,可以看到我的设备fail了一条用例

 

这样,我们完成了在Android studio运行CTS用例的过程,在Android studio中运行测试用例好处是方便调试,比如随便断点,方便阅读,方便修改,语法纠错blablablabla……
如果我们想新写一些用例,也可以在外面写好再弄到源码里配置mk文件编译。
至于不同的模块,可能依赖的jar包不同,但肯定都在~/out/target/common/obj/JAVA_LIBRARIES下被编译出来了,所以如果有同学调试其他的模块因为依赖报错的时候,可以根据出错信息到这个目录下去找。

 

转自Testerhome

作者:summer

原文链接:https://testerhome.com/topics/5305

 

 

 

 

最新文章
1浅谈渗透测试服务在泛互行业带来的价值 在泛互联网行业中,渗透测试服务对于保障企业的网络安全至关重要。
2云手机卡顿/无特定设备/商店登录受限怎么办?WeTest专有云帮您解决! 公有云满足了大量小微企业、个人的测试需求;随着客户深入使用,也遇到了一系列新问题。本篇将对几个常见问题予以解答
3小程序安全相关标准和规章制度 针对小程序安全相关标准及规章制度的调研
4浅谈渗透测试及红蓝攻防对抗中的差异 渗透测试和红蓝攻防对抗已经成为企业保障网络安全的重要手段。
5腾讯WeTest成功当选中关村智联软件服务业质量创新联盟理事单位,获得权威认可! 今年,在北京成功召开的“中关村智联软件服务业质量创新联盟第三届第五次会员大会暨第四届第一次会员大会”中,腾讯WeTest成功当选为新一届的理事单位,腾讯IEG品质管理部总经理荆彦青先生当选为理事。
购买
客服
反馈