Telephony单元测试分析

本文详细分析了Android Telephony的单元测试,包括RIL、Telephony和Package层面的测试。阐述了如何在FrameworksTelephonyTests中测试Telephony-common和Mock-ril模块,以及在GSMPhoneTest和MockRilTest中的具体测试方法。测试涵盖呼出失败、挂断通话等场景,并介绍了如何运行和查看测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#

总览

Name Location Description
libmock_ril hardware\ril\mock-ril A mock ril like SecRil.
mockrilcontroller frameworks\opt\telephony\mockril Communicate with libmock_ril,send and receive fake RIL cmd to/from libmock_ril via socket.
TelephonyMockRilTests frameworks\opt\telephony\tests\telephonymockriltests A Package communicates with libmock_ril via mockrilcontroller, it use InstrumentationTestCase framework to test libmock_ril`s mock functions.
FrameworksTelephonyTests frameworks\opt\telephony\tests\telephonytests A Package using InstrumentationTestRunner and TestCase to test Telephony.

这里写图片描述
上图中,同一层的模块功能相同:

RIL

Reference-ril是Android提供的参考代码。Mock-ril则是一个模拟的Ril模块。三者的功能相同。

Telephony

Telephony和RIL层之间通过Socket通信,mockrilcontroller功能和telephony-common类似,只不过其是与Mock-ril通信。还有一个区别是telephony-common编译为动态库,而mockrilcontroller为静态库

Package

TelephonyMockRilTests 模块中包含静态库mockrilcontroller。通过查看Manifest可以看出TelephonyMockRilTests 测试的目标package是其本身。主要目的是测试mockrilcontroller和Mock-ril模块。
FrameworksTelephonyTests模块中则包含动态库telephony-common,通过查看Manifest可以看出FrameworksTelephonyTests测试的目标package也是其本身。主要目的是测试telephony-common模块。

FrameworksTelephonyTests 分析

根据上一章的测试实例分析,现在来看FrameworksTelephonyTests就不太复杂了。FrameworksTelephonyTests能够同时测试Telephony-common和Mock-ril模块(TelephonyMockRilTests只是对Mock-ril的一个简单测试,在FrameworksTelephonyTests已经覆盖了这部分测试,所以就不再单独分析 TelephonyMockRilTests)。
测试是从TestRunner开始的,FrameworksTelephonyTests新建了一个自定义的TestRunner类TelephonyMockRilTestRunner,用来辅助测试Mock-ril,而对Telephony-common模块的测试,则是直接使用的Android测试框架的的InstrumentationTestRunner。
如下图所示,由于测试用例较多,这里仅挑选2个典型的测试用例进行说明。
这里写图片描述

GSMPhoneTest

GSMPhoneTest继承了AndroidTestCase类并实现了PerformanceTestCase接口,根据上文可知,AndroidTestCase 继承于JUnit的TestCase,并没有使用Instrumentation框架,所以GSMPhoneTest该用例不能使用Android Instrumentation框架的方法。

1 setUp():

首先初始化GSMTestHandler和GSMPhone对象,得到GSMPhone的引用。并通过GSMPhone对象的方法,注册EVENT_POST_DIAL等一系列事件。

sc = new SimulatedCommands();
mGSMPhone = new GSMPhone(mContext, sc, new TestPhoneNotifier(), true);

不过新建GSMPhone时,传递的RIL接口是一个模拟的接口,这样在调用GSMPhone方法时,并非调用到正常的RIL.java发送AT指令。而是一个模拟的ril对象SimulatedCommands上。
这样,该测试除了ril接口和调用者是虚拟的,其他Telephony流程和正常流程一致,见下图:

这里写图片描述

2 testOutgoingCallFailImmediately():

该测试方法用来测试呼出的呼叫立即失败的边缘测试(呼叫还没有出现在call list之前就立即终结),这会导致该失败的呼叫在ForegroundCall list中以IDLE call的形式出现。

public void testOutgoingCallFailImmediately() throws Exception {
    Message msg;
    mRadioControl.setNextDialFailImmediately(true);

    Connection cn = mGSMPhone.dial("+13125551212");

    msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT);
    assertNotNull("Message Time Out", msg);
    assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState());

    asse
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值