技术开发 频道

在S60平台进行单元测试

  【IT168技术】概述

  本文档是一篇实用指南,它介绍了单元测试、设计单元测试的技术以及在S60平台上创建和运行单元测试时可使用的工具。我们所期望的读者是对他们自有的代码模块进行编写和运行的开发者。一般来说单元测试是一个庞大的体系,它包括无穷多的技巧、定义和方法。通常的办法是将测试分为不同的级层,比如:

  * 单元测试,指软件的每个单元(通常是单个的类)都用来被(通常是开发者)测试以确认单元的设计细节运行无误。

  * 整体测试,指由各组件(小规模且测试过的组件)合成的整体软件被拿来测试。

  * 系统测试,指由各组件最终整合而成的软件被拿来测试以显示所要的需求。

  * 可接受性测试,指通常由客户运行以测试决定所提交的软件是否可被接受。

  一个小的程序可由一个小的单元生成,没有独立的整体测试级层。对于大的系统,把由小单元合成的大组件分割看来是很明智的。在这种情况下,整体测试在确保整体性不会扰乱各个基本功能函数的过程中起到了非常重要的作用。

  单元测试大多数是被开发者设计和运行的,这就意味着在开发初期就能检测到错误,所以纠正它们要比在系统测试或是接受性测试时小很多开销。单元测试、测试驱促开发和测试框架被Richard Carlsson和Micka??l Rémond[13]很好地联系起来;请看附录C。

  在S60 C++开发平台上的一个很好的方式是将算法和业务逻辑与用户接口分开。通常我们会有无UI依赖性的驱动DLL,于是单元测试仅被用于组成DLL的类。对驱动DLL的整体测试通常被称为“组件测试”,它在整体测试级层终止。组成DLL的不同类要被分别测试,并在单元测试级层终止。

  本文档的其他部分涉及了单元测试技术和S60 C++开发平台的观点的实践。如上所述,我们期望的读者是开发者,但同时其他行业的读者也能从中得到有趣的内容和信息。

  Symbian C++ 单元测试的应用介绍

  在其简易的格式里,单元测试可被执行为无UI的,在查看返回值时即可知道测试是否成功。该执行过程可被应用到运行一个或多个测试。从长远来看,当同时有很多测试程序时,简单的办法是创建一个框架,它能自动地为测试制造环境,然后执行那些小的测试模块并做结果报告,这种框架被称为测试框架。 EUnit[4] 是一个商业软件,而SymbianOSUnit[2],[3]则是免费的。

  如果只是测试性地使用SymbianOSUnit,它是免费的。对于大规模开发,制造商业软件,那就需要支付一定的费用,因为它们提供运行时所需要时间和金钱的特性(查看附录B)。

  S60平台:地图和定位范例就在测试部分做了拓展,不过仅做演示使用。在真实生活中,单元测试应该在具体的类被应用前即工程开发期间就被编写。单元测试由类 CMapExampleSmsEngine 创建。

  ● 创建一个测试工程

  开发者应该在他们的电脑上安装Carbide C++ 1.2和S60 3rd FP1,还应激活Carbide的命令行工具(从Carbide的开始菜单项里选择Configure environment for WINSCW command)。

  从诺基亚论坛下载S60平台:地图和定位范例[1]并解压缩,确保其存放路径为C:\temp\MapEx。 然后从Sourceforge[3]下载SymbianOSUnit并解压缩。将SymbianOSUnit由解压缩后的根目录复制到C:\temp\SymbianOsUnit。SymbianOSUnit需要nmake,所以需下载它[6],解压缩后复制NMAKE.EXE和NMAKE.ERR到路径地址到C:\Program Files\Nokia\Carbide.c++ v1.2\x86Build\Symbian_Tools\Command_Line_Tools.

  在此之前,建议读者阅读教程文档和测试框架提供的例子。

  现在我们开始创建单元测试工程和一些测试:

  1.在范例工程下创建路径 C:\vidyasvn\MapEx\test。

  2.从测试框架应用教程复制\Tutorial\group\ExtraTestBuildTasks.bldmake和\Tutorial\test\testgen.bat到测试路径。

  3.在TestHeader.h文件中创建一个最小的测试套件:任何测试首选的方法就是将它们看作一个测试实例;测试目标作为类变量添加进去并且该测试类(也称为不变量)是继承自CxxTest::TestSuite。

1 #ifndef TESTHEADER_H
2 #define TESTHEADER_H
3
4 #include "TestSuite.h"
5
6 // forward declaration
7 class CMapExampleSmsEngine;
8 class MSmsEngineObserver;
9
10 class CMapExampleSmsEngineTest : public CxxTest::TestSuite
11 {
12 public:
13     CMapExampleSmsEngineTest(const TDesC8& aSuiteName) :
14 CxxTest::TestSuite(aSuiteName){}
15
16 private: // from CxxTest::TestSuite
17     virtual void setUp();
18     virtual void tearDown();
19
20 public:
21     void testParseMsgCoordinates();
22     void testParseMsgRequestType();
23     void testParseMsgUid();
24     void testSendMessage();
25     void testSendMessageExceptions();
26
27 private: // data
28     MSmsEngineObserver* iObserver;
29     CMapExampleSmsEngine* iTarget;
30 };
31
32 #endif // TESTHEADER_H
33

 

 

0
相关文章