您的位置:首页 > 其它

使用Symbian OS Unit单元测试框架进行单元测试

2010-02-26 09:14 302 查看
http://www.yuelongr.cn/post/773.html

Contents

1 前言

2 将单元测试框架加入你的项目

2.1 拷贝单元测试框架到项目目录

2.2 配置单元测试框架的项目定义文件

2.2.1 Carbide.C++

2.2.2 Vs2003.net

2.3 导入单元测试项目文件

3 HelloUnitTest 示例工程介绍

3.1 写我们的第一个测试用例

3.1.1 添加一个新的测试用例

3.1.2 编辑TestSource.cpp加入我们的测试用例实现

3.1.3 运行testgen脚本生成测试TestDriver.h

3.1.4 编译测试框架并且运行

3.2 单元测试框架的运行界面

3.3 准备运行单元测试框架

3.4 运行结果

4 添加一个TestSuite

4.1 添加一个新的TestSuite声明

4.2 添加测试用例实现

4.3 更新TestDriver.h

4.4 运行单元测试框架

5 检测内存泄漏

6 查看用例测试日志

前言

关于单元测试的概念请参考其他资料,SymbianOS Unit是一个开源的单元测试框架和junit,cppunit类似。如果你熟悉这两个开源的单元测试工具上手起来应该比较快。这里我只是介绍基于symbian系统的一个开源单元测试框架的使用。作为目前Symbian项目开发的一个培训资料。更详细的信息请访问:http://www.symbianosunit.co.uk/

将单元测试框架加入你的项目

假设你已经安装配置好了Symbian开发的基本环境,包括IDE(vs.net or carbide C++),SDK,ACTIVE PERL等。另外你需要下载SymbianOSUnit源码包,本文使用的版本是1.02

拷贝单元测试框架到项目目录

假设我们的项目所在目录为UnitTestExp,项目路径为UnitTestExp/HelloUnitTest。 按照以下步骤设置操作

1.解压symbianosunit07112006_v1.02.zip 到 your_path/SymbianOSUnit07112006_v1.02 2.拷贝your_path/SymbianOSUnit07112006_v1.02/Haystacks/CopyToYourProject/内的所有内容到UnitTestExp/HelloUnitTest(覆盖拷贝) 3. 拷贝your_path/SymbianOSUnit07112006_v1.02/Haystacks/SymbianOSUnit到UnitTestExp/SymbianOSUnit

配置单元测试框架的项目定义文件

Carbide.C++

首先需要对单元测试框架的项目定义文件进行简单的配置,确认SymbianOSUnit.mmp已经拷贝到HelloUnitTest/group/目录下。编辑SymbianOSUnit.mmp文件

/*
* ============================================================================
* Name : SymbianOSUnit.mmp
* Part of : SymbianOSUnit
* Created : 19/10/2006 by vm,sj
* Description:
* This is the project specification file for sample project.
* Initial content was generated by Series 60 AppWizard.
*
* Version :
* Copyright: Penrillian. All rights reserved.
* Web : www.penrillian.com
* ============================================================================
*/

//单元测试TestSuit
SOURCEPATH ../test
SOURCE TestSource.cpp
USERINCLUDE ../test

//需要测试的项目目标源文件
SOURCEPATH ../src
USERINCLUDE ../inc
SOURCE StackClass.cpp

//include SymbianOSUnit mmp file from proper directory depending on relative path and target platform

#include "../../SymbianOSUnit/SymbianOSUnitApp/group/s60/SymbianOSUnit.source"

Vs2003.net

这里假设你已经配置好了Vs2003.net的Symbian的开发环境(Vs2003+Carbide.net). 首先你需要打开UnitTestExp/SymbianOSUnit/SymbianOSUnitApp/group/S60((在这里假设使用算s602.x版本SDK))。 另存SymbianOSUnit.source为SymbianOSUnit-with-HelloUnit.mmp 。编辑SymbianOSUnit-with-HelloUnit.mmp 文件加入以下配置用来指定测试用例的源文件和头文件。

SOURCEPATH ../../../../HelloUnitTest/src
SOURCE StackClass.cpp

SOURCEPATH ../../../../HelloUnitTest/test
SOURCE TestSource.cpp

USERINCLUDE ../../../../HelloUnitTest/inc
USERINCLUDE ../../../../HelloUnitTest/test

导入单元测试项目文件

接下来我们可以通过IDE的向导导入我们配置好的项目文件。

Carbide.C++ 导入 UnitTestExp/HelloUnitTest/group/SymbianOSUnit.mmp

Vs2003 导入 UnitTestExp/SymbianOSUnit/SymbianOSUnitApp/group/S60/SymbianOSUnit-with-HelloUnit.mmp

HelloUnitTest 示例工程介绍

HelloUnitTest 是一个简单的Symbian UI应用程序,此程序使用了一个简单的堆栈类,并且在图形界面中演示了堆栈PUSH,POP的动作。在这里我们要通过单元测试框架对我们这个项目中的CStack类进行单元测试。下图显示了HelloUnitTest的运行界面。





写我们的第一个测试用例

现在我们来写一个测试用例来检查CStack类,我们把一系列功能测试叫做Test suites . 依据规范每个TestSuite必须继承自 CxxTest::TestSuite。所有的测试方法必须以小写的'test'开头如;void CTest::testDummyTest() 。我们应该避免在项目里有以test开头的方法或函数避免产生冲突。

一个TestSuit的代码

#include "TestHeader.h"
#include "TestDriver.h"
#include "Logger.h"

void CTest::setUp()
{
}

void CTest::tearDown()
{
}

void CTest::testDummyTest()
{
TS_ASSERT(ETrue);
}

添加一个新的测试用例

编辑TestHeader.h 加入一个测试用例的声明

public:
void testMyFirstTest();

编辑TestSource.cpp加入我们的测试用例实现

void CTest::testMyFirstTest() {
TS_ASSERT(ETrue);
}

运行testgen脚本生成测试TestDriver.h

TestDriver.h是一个测试框架使用的描述测试任务的头文件,我们每添加一个测试用例或TestSuite需要使用testgen脚本生成或更新TestDriver.h

D:/project/symbian/UnitTestExp/HelloUnitTest/test>testgenD:/project/symbian/UnitTestExp/HelloUnitTest/test>rem Copyright (c) Penrillian Ltd 2003-2006. All rights reserved.D:/project/symbian/UnitTestExp/HelloUnitTest/test>rem Web: www.penrillian.comD:/project/symbian/UnitTestExp/HelloUnitTest/test>perl -S ../../SymbianOSUnit/cxxtestgen.pl -o TestDriver.h TestHeader.h请按任意键继续. . .D:/project/symbian/UnitTestExp/HelloUnitTest/test>

编译测试框架并且运行

添加了一个新的测试用例我们需要重新编译测试框架。然后运行测试框架,其结果如下图。

单元测试框架的运行界面





准备运行单元测试框架





运行结果





添加一个TestSuite

有时候一个TestSuite装载的测试用例过多(TestCase)对TestSuite运行的时候会比较慢,或者我们希望把功能模块相近的测试用例放在一起。在这种情况下我们可以考虑创建多个TestSuit,选择每个TestSuit进行单独运行而不是运行所有的TestSuit。接下来我们为我们的CStack类写一个新的TestSuite.

添加一个新的TestSuite声明

添加新TestSuite定义到TestHeader.h中

class CNewTestSuite : public CxxTest::TestSuite
{
public:
CNewTestSuite(const TDesC8& aSuiteName):CxxTest::TestSuite(aSuiteName){}

public:

void testAfterCreationL();
void testPushAndPopL();
void testPopEmptyL();

private:
void setUp();
void tearDown();

private:
CStack *iStack;
};

添加测试用例实现

在TestSource.cpp中添加以下代码

void CNewTestSuite::setUp()
{
iStack=new(ELeave)CStack;
}

void CNewTestSuite::tearDown()
{
delete iStack;
}

void CNewTestSuite::testAfterCreationL()
{
TS_ASSERT_EQUALS(iStack->CurrentSize(), 0);
}

void CNewTestSuite::testPushAndPopL()
{
iStack->push(1234);
TS_ASSERT_EQUALS(iStack->CurrentSize(), 1);
TS_ASSERT_EQUALS(iStack->pop(), 1234);
TS_ASSERT_EQUALS(iStack->CurrentSize(), 0);
}

void CNewTestSuite::testPopEmptyL()
{
TS_ASSERT_THROWS_ANYTHING(iStack->pop());
}

更新TestDriver.h

运行your_project/testgen.bat 更新TestDriver.h

运行单元测试框架

编译测试框架并且运行,你会看到选项菜单多出一个TestSuite。我们可以选择运行所有的TestSuite也可以选择单独的TestSuite运行。





注:如果你希望添加新的TestSuite在自己定义的头文件中和源文件中(如TestNewSuite.h TestNewSuite.cpp)你必须更新your_project/test/testgen.bat.为其添加新的头文件名称

perl -S ../../cxxtestgen.pl -o TestDriver.h TestHeader.h TestNewSuite.h

然后你还要修改your_project/group/ExtraTestBuildTasks.bldmake 文件添加如下内容

$(INCDIR)/testdriver.h: $(INCDIR)/TestHeader.h:$(INCDIR)/TestNewSuite.h

检测内存泄漏

单元测试框架会自动检测每个测试用例的内存泄漏问题,如果测试用例存在内存泄漏将导致测试失败。以下代码将会因为内存泄漏而导致测试失败

CStack::CStack()
{
iSize=0;
User::Alloc(1);
}

测试用例运行结果





查看用例测试日志

单元测试框架会把测试用例结果同时输出到系统日志文件中,输出目录为目标设备的c:/log .文件名称是SOSUnit.log 。确保你的目标设备c:/log目录存在,否则Symbian系统不会自动创建。如果你使用模拟器,文件将输出在模拟环境的目标设备中 (SDK_HOME/Epoc32/winscw/c/logs) 。

模拟器环境日志输出地址

C:/Symbian/8.0a/S60_2nd_FP2_CW/Epoc32/winscw/c/logs

测试用例日志文件内容

unning 5 tests ....CNewTestSuite:TestSource.cpp:54: Expected (iStack->pop()) to throw (...) but it threw nothingFailed 1 of 5 test(s)Success rate: 80% (来自:Forum Nokia Wiki)

上一篇文章: Carbide 2.0 license过期问题"Evaluation license will expire in 7 days"

下一篇文章: 通过RSendAs发送电子邮件

TrackBack: 点击这里获取该日志的TrackBack引用地址

本文标签(Tags): Symbian OS Unit.单元测试框架Symbian

收藏到: QQ书签百度搜藏Google书签新浪ViVi雅虎收藏和讯网摘POCO网摘天极网摘CSDN网摘鲜果收藏

相关文章

正在开发中的新一代Symbian UI泄露

如何在Symbian中使用Qt加载和缩放图片

Symbian编程之Qt的Qtimer使用方法

如何列出指定文件或目录的列表

Symbian编程之中文技术文章汇总

CAknNumberQueryDialogAPI数字输入对话框

投影手机Logic Bolt 1.5 国外厂商推出的新塞班手机

如何使用TEntry类读取文件大小

PKG语法详细说明 常用高级选项

使用RHTTPTransaction后产生CONE 36 Panic的解决办法

通过RSendAs发送电子邮件

symbian的网络通讯Socket API

如何通过SQL API操作数据流

相机的自动对焦功能 Symbian编程中的实现

Symbian中使用RSendAs发送短消息

手机音量控制API的使用方法

如何使用RLibrary动态加载一个多态的DLL

使用OMA客户端自动配置在手机上的设置电子邮件和浏览等

触摸界面的全屏模式

使用HTTP过滤插件模拟HTTP回应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: