动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 软件工程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 软件工程 ]的信息



本月文章推荐
.需求工程概述.
.建立有效的软件度量过程.
.SOA的中间件:未来前景广阔 现实.
.华尔街希望充分利用SOA.
.SOA and Web services简介.
.使用软件工程学来开发软件.
.微软事务处理服务介绍.
..NET Remoting构建分布式数据库查.
.用UML模型实现大型实时监控应用软.
.BEA服务:让SOA实施更快捷.
.质量管理新七种工具简介(1).
.WinCE 进程、线程和内存管理(一).
.统一建模语言UML轻松入门之用例.
.软件文档简介.
.Web服务加SOA方式备受青睐.
.浅谈程序员与系统分析师.
.Tivoli——IBM 服务管理.
.客户关系管理的三大纪律.
.软件测试概述.
.在.NET中使用命名管道完成进程间.

单元测试作业指导系列讲座之一

发表日期:2008-3-23 |



  这是我以前任项目经理时,编写的关于单元测试方面的作业指导书,针对多种开发环境叙述怎么进行单元测试以及环境配置,现在整理了一下。应该对大家有所帮助。

  这是第一部分,主要针对C和C++项目的(包括了Windows环境和Linux环境),下部分将针对Java及J2EE项目。

  1. 目的

  为了减少代码中的错误数量, 减少调试所花的时间和精力, 改善软件质量, 减少开发和维护的时间和成本。

  2. 适用范围

  适用于C及C++的所有产品。

  3. 适用内容

  3.1 C++标准

  3.1.1测试环境使用Visual C++,Windows窗口应用程序

  3.1.1.1前题:使用CppUnit1.6.2版,解压后,路径为x:\\cppunit-1.6.2;

  在工程文件中配置测试框架使用环境:加入执行头文件的路径x:\\cppunit-1.6.2\include,加入导入库文件的路径x:\\cppunit-1.6.2\lib;

  配置DEBUG(测试)版环境:

  加入需要链接的静态测试框模块testrunnercd.lib(运行测试用例的选择对话框)和cppunitcd.lib(测试框架);

  加入测试Add-ins,库名为x:\\cppunit-1.6.2\lib\TestRunnerDSPlugInD.dll;

  在Project Settings/C++/C++ Language中启用RTTI;

  3.1.1.2建立测试用例:

  1、以类名加前辍“Test”命名测试单元文件名,比如“CMabString”类的类文件名为MabString.cpp,则测试单元文件命名为TestMabString.cpp;

  2、加入测试框架头文件以及要测试的单元头文件,以TestMabString为例:

  头文件:testmabstring.h

#ifndef CPP_UNIT_TestNode_H
#define CPP_UNIT_TestNode_H
//包含测试框架的头文件
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
//包含被测试单元的头文件
#include "mabstring.h"
//派生测试框架的测试用例类
class TestMabString : public CppUnit::TestCase
{
 //定义测试用例列表,此列表将出现在运行测试用例的选择对话框中
 CPPUNIT_TEST_SUITE( TestMabString );
 CPPUNIT_TEST( FindByName );
 CPPUNIT_TEST_SUITE_END();

 protected:
 //
 CMabString m_MabStr;
 public:
  //用例初始化,可作为桩函数
  void setUp ();
  //用例析构
  void tearDown();
 protected:
  //测试用例
  void FindByName (void);
};

#endif

类文件:testmabstring.cpp

#include "TestMabString.h"
#include "iostream.h"
#include "strstrea.h"

//注册本测试单元

CPPUNIT_TEST_SUITE_REGISTRATION( TestMabString );

//定义测试用例

void TestMabString::FindByName ()
{
 //功能性测试,属黑盒测试
 //normal test
 //条件及错误测试,属白盒测试
 //extra test,
 //例外测试,属白盒测试
 //exception test,

 bool bRet=false;
 try{
  //put the exception code here...
 }
 //catch(CXXX& e)
 catch(...)
 {
  bRet=true;
 }
 CPPUNIT_ASSERT(bRet);
 //由于并不能够执行所有单元测试应该执行的路径,比如CMabString是从CString
 //类中派生出来的,而可能CMabString中的Find只简单调用了CString中的Find方法,//所以并不需要测试;
 //在此处说明所有不用测试的路径;
 //other test, see the ...
}

void TestMabString::setUp ()
{
 //开始测试前的初始代码
 m_pNode=new Node();
}

void TestMabString::tearDown()
{
 //测试结束代码
 if(m_pNode)
  delete m_pNode;
}

  3、在启动程序中加入以下代码,以便运行“测试用例选择”对话框:


#ifdef _DEBUG

//包括测试头文件

#include <msvc6/testrunner/TestRunner.h>

#include <cppunit/extensions/TestFactoryRegistry.h>

static AFX_EXTENSION_MODULE extTestRunner;

#endif



//以下为测试代码,此部分测试不会出现在发布版中

#ifdef _DEBUG

TestRunner runner;

runner.addTest ( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );

runner.run ();

#endif
  4、制作发行版

  发行版需要做以下工作:

  将Project的属性设置为Release(这将自动去除_DEBUG的声明);

  从工程项目中去掉测试文件(即带有test前辍的文件);

  3.1.2测试环境使用Visual C++,Windows非窗口应用程序

  3.1.2.1前题:使用CppUnit1.6.2版,解压后,路径为x:\\cppunit-1.6.2;

  在工程文件中配置测试框架使用环境:加入执行头文件的路径x:\\cppunit-1.6.2\include,加入导入库文件的路径x:\\cppunit-1.6.2\lib;

  配置DEBUG(测试)版环境:

  加入需要链接的静态测试框模块cppunitcd.lib(测试框架);

  在Project Settings/C++/C++ Language中启用RTTI;

  3.1.2.2建立测试用例:

  1、以类名加前辍“Test”命名测试单元文件名,比如“CMabString”类的类文件名为MabString.cpp,则测试单元文件命名为TestMabString.cpp;

  2、加入测试框架头文件以及要测试的单元头文件,以TestMabString为例:

  头文件:testmabstring.h

  3、测试示例同上;

  3.2 C标准

  3.2.1测试环境使用gcc,Linux非窗口应用程序

  前题:使用check0.8.0版,解压后,路径为/xx/check-0.8.0;

  配置测试框架使用环境(我建议采用标准组织推荐的使用Autoconf和Automake来生成配置文件configure和Makefile,因为使用它们可以建立符合国际标准的configure脚本 和Makefile文件,并且可以有效的建立压缩包和方便分发必需的文件(也方便在发行版中去除测试用例文件):

  l 首先需编写configure.in文件,此文件用于Autoconf生成configure可执行脚本;configure.in的框架大致如下:

  dnl 此文件用于生成configure脚本,

  dnl AC_INIT的xxxx.h参数代表本目录下一个有效的文件名

  AC_INIT(xxxx.h)

  dnl AM_INIT_AUTOMAKE的两个参数分别是生成应用程序的版本及版本号,

  dnl 可能有些版本的Autoconf和Automake不支持此宏

  AM_INIT_AUTOMAKE(xxxx, x.x)

  dnl 以下为编译依靠的检测

  dnl Checks for programs.

  AC_PROG_AWK

  AC_PROG_CC

  AC_PROG_INSTALL

  AC_PROG_LN_S

  dnl Checks for libraries.

  AC_CHECK_LIB(check,suite_create)

  dnl Checks for header files.

  AM_CONFIG_HEADER(config.h)

  dnl Checks for typedefs, strUCtures, and compiler characteristics.

  dnl Checks for library functions.

  dnl 将Automake生成的Makefile.in文件输出为Makefile文件

  AC_OUTPUT(Makefile)

  (提示:autoscan可以生成configure.in文件的基本框架,但很基本,可其生成的configure.scan文件的基础补充,然后更名为configure.in)

  l 编写Makefile.am文件,用于Automake生成Makefile.in文件,Makefile.am文件的大致框架如下:(其中xxxx为应用程序文件名,比如program.c文件的测试程序文件名我建议为check_program.c;)

TESTS = check_xxxx

noinst_PROGRAMS=check_xxxx

frame_path=xx/check-0.8.0

xxxx_docs =\

srcfilelist_1\

srcfilelist_2\

.......\

.....

xxxx_SOURCES=\

srcfilelist_1\

srcfilelist_2\

.......

EXTRA_DIST = $(xxxx_docs)
INCLUDES = -I$(frame_path)/src -I$(other_path)/include

LDADD= \$(frame_path)/src/libcheck.a

CLEANFILES=*.*~
  (Makefile.am有很许多标记,可以参阅相应文档。但常用的如:noinst_PROGRAMS为生成的可执行文件,xxxx_SOURCES(应用程序名加后辍_SOURCES)为源文件列表,EXTRA_DIST为发布程序时不需要的文件列表(用此方法可以将测试文件去掉),INCLUDES为要包含的头文件路径,check的头文件位置在其安装目录下的src中;LDADD为要链接的库文件名,libcheck.a为check测试框架的库文件;)

   使用Automake –a –-foreign来生成Makefile.in文件,--foreign是为了生成几个外部文件如install.sh等,假如已有这些文件则可以省略这个参数;

   使用Autoconf来生成configure执行脚本;然后执行./configure来生成Makefile文件;

   执行make来生成可执行程序;

  3.2.2 建立测试用例:

  1、以程序文件名加前辍“check_”命名测试单元文件名,比如money.c文件的测试单元文件命名为check_money.c;

  2、加入测试框架头文件以及要测试的单元头文件,以check_money为例:

  头文件:money.h;源文件:money.c;测试单元文件:check_money.c:

  测试文件框架如下:


#include <stdlib.h>

#include <check.h>

#include "money.h"

/*建立必要的测试变量,Money为money.h中定义的结构struct money*/

Money *five_dollars;

/*单元测试初始化函数*/

void setup (void)

{

five_dollars = money_create(5, "USD");

}

/*单元测试结束函数*/

void teardown (void)

{

money_free (five_dollars);

}


/*单元测试用例,用例名为test_create*/

/*test functions: money_amout()*/

START_TEST(test_create)

{

/*功能性测试,属黑盒测试*/

/*normal test*/

fail_unless (money_amount(five_dollars) = = 5,

"Amount not set correctly on creation");

fail_unless (strcmp(money_currency(five_dollars),"USD") = = 0,

"Currency not set correctly on creation");

/*条件及错误路径测试,属白盒测试*/

/*extra test*/

}

END_TEST


/*单元测试用例,用例名为test_net_create*/

START_TEST(test_neg_create)

{

Money *m = money_create(-1, "USD");

fail_unless (m = = NULL, "NULL should be returned on attempt to create with a negative amount");

}

END_TEST



/*单元测试用例,用例名为test_net_create*/

START_TEST(test_zero_create)

{

Money *m = money_create(0, "USD");

fail_unless (money_amount(m) = = 0,

"Zero is a valid amount of money");

}

END_TEST



/*单元测试组装,将所有单元测试组装到一个“箱子”里面,“箱子”名为Money*/

Suite *money_suite (void)

{

Suite *s = suite_create("Money");



/*测试用例分组*/

TCase *tc_core = tcase_create("Core");

TCase *tc_limits = tcase_create("Limits");



/*将分组加入“箱子”

suite_add_tcase (s, tc_core);

suite_add_tcase (s, tc_limits);



/*分别将不同用例加入分组*/

tcase_add_test (tc_core, test_create);

tcase_add_checked_fixture (tc_core, setup, teardown); /*此用例注册初始化和结束函数*/

/*以下用例将不注册初始化和结束函数*/

tcase_add_test (tc_limits, test_neg_create);

tcase_add_test (tc_limits, test_zero_create);

return s;

}



/*执行测试用例*/

int main (void)

{

int nf;

Suite *s = money_suite();

SRunner *sr = srunner_create(s);

srunner_run_all (sr, CK_NORMAL);

nf = srunner_ntests_failed(sr);

srunner_free(sr);

suite_free(s);

return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;

}

  3.2.3 制作发行版:

  制作发行版只须配置另外一份Makefile.am,在此文件中的源文件列表加入执行主体,即应用程序包含main函数的文件;也可在制作测试版的Makefile.am中加入发行版的配置,这样就可以直接生成测试版程序和发行版程序。

上一篇:ERP失败的10大祸首 人气:145
下一篇:Micosoft实时通信API多媒体支持慨述 人气:219
浏览全部软件工程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-8 ECShop v2.6.0 Build 20080707(G
2008-7-8 动网论坛PHP版 v2.0++ Build 080
2008-7-8 中国IT总舵 v9.0 UTF版
2008-7-8 凹丫丫新闻发布系统 v4.6 Build
2008-7-8 topview数据查询 v3.0
2008-7-8 Z-Blog v1.8 Spirit Build 80708
2008-7-8 Z-Blog v1.8 Spirit Build 80708
2008-7-8 凹丫丫新闻发布系统 v4.6 Build
2008-7-8 新动软万能网站内容管理cms系统
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報