使用 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让崩溃“说话”:AI如何在噪声中识别根因信号? 游戏行业面临长线运营转型,崩溃治理成为关键挑战。腾讯CrashSight平台推出AI驱动的三大创新方案,推动游戏质量保障进入智能时代。
2范式转移:LLM如何重塑游戏自动化测试的底层逻辑 在WeTest与徐汇游戏服务产业中心合办的一场以“游戏AI技术提效”为主题的前沿技术研讨中,腾讯专家展示了基于LLM的智能体如何为游戏测试注入“认知智能”,从而重新定义自动化测试的边界与价值。
3「低成本、高质高效」WeTest AI翻译限时免费 如何突破语言壁垒,让游戏内容原汁原味地触达全球玩家?腾讯WeTest团队在提供LQA外,推出的AI翻译服务,正为这一难题提供全新解法。项目可根据自己的项目情况,选择适合的业务。
4共探游戏产业新未来,AI与云发行成提效增值核心引擎 由徐汇区文化和旅游局指导,腾讯WeTest等联合主办的“解锁游戏提效增值新范式”专场分享会成功落幕。活动聚焦游戏产业最前沿的AI与云技术,吸引了近百位游戏、金融、泛互联网行业从业者参与。
5游戏性能测评数据“上新” 一图读懂逐点半导体与腾讯PerfDog联合打造的 “帧生成”指标 逐点半导体与腾讯PerfDog联合打造的 “帧生成”指标,一图带你读懂!
购买
客服
反馈