使用 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

 

 

 

 

最新文章
1WeTest携PC&主机游戏质量保障服务和性能测试平台PerfDog亮相Gamescom 2024 以全场景游戏质量保障服务及性能测试解决方案,助力全球游戏行业的创新与发展
2一张图带你了解小程序隐私合规检测 快速了解小程序隐私合规检测如何防范黑灰产风险,守护用户数据安全
3防范小程序隐私合规风险,筑牢用户信任防线 了解隐私合规检测如何帮助小程序规避数据安全风险
4WeTest 海外测试需求有奖问卷活动中奖名单公布 近日,WeTest 海外测试需求有奖问卷活动圆满结束,经过紧张的统计与筛选,以下朋友们中奖,成功获得了我们的门票礼品。
5海外本地化测试的全生命周期服务 第三期 支付测试 海外支付风控升级,非本地测试封号现象频发,真金测试推进困难?来看WeTest的本地化支付测试方案
购买
客服
反馈