在S60平台进行单元测试(上)

发表于:2010-3-12 11:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Li Fang    来源:forum.nokia.com

  ● 排除依赖关系

  开发者现在应该开始测试实驱动类。首先,包括一个对源文件(TestSource.cpp)测试目标的定义(CMapExampleSmsEngine)

  #include "cmapexamplesmsengine.h"

  然后从.mmp文件中用非注释行的方式把测试目标函数加到工程中。

  SOURCE      CMapExampleSMSEngine.cpp

  这里有一个非常难的部分:在执行的过程中测试性是不被考虑的,所以可能会有联缠,私有区域等困难,使得单元测试具有挑战性。在我们的实例中,会使用信息类>RSendAsMessage和RSendAs,但是模拟结果是很困难的。

  解决问题的办法是把默认的库函数替换为开发者自己的。当不能和现有的库相连,但使用开发者所需要的库函数就可实现时,该方法可被使用。当我们缺失一个.mmp文件中的库函数时,编译器将会编译源代码,但链接部分将无法生成最终代码,报错如下:

Undefined symbol: 'void RSendAsMessage::CreateL(class RSendAs &, class TUid) (?CreateL@RSendAsMessage@@QAEXAAVRSendAs@@VTUid@@@Z)'

  开发者的任务是使用一些函数实现这种方法,以达到测试需求。此时首先可选择的是简单的空函数,方法是将函数返回值设为NULL或者其他硬编码默认值。注意此方法金用于目标测试工程需要使用函数时(例如,并不需要使用29种所有的RSendAsMessage方法)。空函数法类似于以下几行实现链接的代码:

void RSendAsMessage::CreateL(RSendAs &, TUid) {}
TInt CMsvStore::HasBodyTextL(void) const { return KErrNone; }
CMsvStore * CMsvEntry::ReadStoreL(void) { return NULL; }

  当所有缺失的方式都被使用之后,目标工程编译并链接。此时测试工程将正常无误运行。

  ● 实现测试

  现在我们开始在实际条件下测试目标。任何有测试前缀的方式可看作是一个由框架执行的测试实例。测试实例被执行之后,该测试框架在调用测试法和tearDown()之前调用setUp()函数。安装时应把测试目标设置成默认状态。测试实例中,只需要在已经实例化的测试目标中运行该方式以证实使用的方式和状态是我们预期的。测试目标和设置时生成的其它源代码需被销毁。我们可按以下方式设置:

void CMapExampleSmsEngineTest::setUp()
  {
   iObserver = new (ELeave) DummyObserver();
   iTarget = CMapExampleSmsEngine::NewL(iObserver);
  }

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号