CppUnit测试框架入门(2)

基于CPPUNIT测试框架开发Android平台的测试程序 本文档在对CPPUINT简单介绍的基础上,主要讲解针对Android的C/C++代码,如何利用CPPUINT进行单元测试的方法和步骤。1、  CPPUINT简介CPPUNIT是基于JUnit衍生而来的,专门面向C++代码的测试框架。其主要功能有:n        带有附加数据的XML输出n        集成到某个IDE中,以编译文本方式进行结果输出n        更便于 阅读详情
CppUnit测试框架入门(2)

Author: Cpluser
Website:http://www.enjoyimage.com
Email:enjoyimage@163.com
Blog:http://blog.youkuaiyun.com/cpluser/

演示代码下载

三、CppUnit开发环境设置
 
认识了CppUnit的测试环境,想必你已经是在磨拳擦掌,准备在你的开发过程中感受一下测试驱动开发的感觉了。不过,在使用CppUnit前,还需要设置一下你的开发环境。
 
1、CppUnit的lib和dll
CppUnit为我们提供了两套框架库,一个为静态的lib,一个为动态的dll。
 
cppunit project:静态lib
cppunit_dll project:动态dll和lib
 
在开发中我们可以根据实际情况作出选择。进入src文件夹,打开CppUnitLibraries.dsw。分别编译这两个project,输出位置均为lib文件夹。
另外一个需要关注的project是TestRunner,它输出一个dll,提供了一个基于GUI 方式的测试环境,即前面我们提到的两种测试环境之一。我们也需要编译这个project,输出位置亦为lib文件夹。
为了方便开发,我们把这些编译出来的lib和dll(包括Debug版和Release版) copy 到我们自己建立的一个文件夹中(当然你也可以不这么做),例如F:/cppunit1.9.0/lib/,同时我们也把CppUnit源代码中include文件夹copy到我们自己的include文件夹下。然后在VC的tools/options/directories/include files和library files中设置include路径和lib路径。最后别忘了在你的project中link正确的lib。
 
2、在你的VC project中打开RTTI开关。
具体位置Project Settings/C++/C++ Language。
 
3、为TestRunner.dll设置环境变量
TestRunner.dll为我们提供了基于GUI的测试环境。为了让我们的测试程序能正确的调用它,TestRunner.dll必须位于你的测试程序的路径下。但最简单的方法是在操作系统的环境变量Path中添TestRunner.dll的路径,这样是最省事的。
 
四、你的第一个TDD example
 
一切准备就绪,现在我们可以来看看怎样添加测试代码了。前面我们提到过,CppUnit最小的测试单位是TestCase,多个相关TestCase组成一个TestSuite。要添加测试代码最简单的方法就是利用CppUnit为我们提供的几个宏来进行(当然还有其他的手工加入方法,但均是殊途同归,大家可以查阅CppUnit头文件中的演示代码)。这几个宏是:
 
CPPUNIT_TEST_SUITE() 开始创建一个TestSuite
CPPUNIT_TEST() 添加TestCase
CPPUNIT_TEST_SUITE_END() 结束创建TestSuite
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION() 添加一个TestSuite到一个指定的TestFactoryRegistry工厂
 
感兴趣的朋友可以在HelperMacros.h看看这几个宏的声明,本文在此不做详述。
 
1、一个实现两个整数相加的类
假定我们要实现一个类,类名暂且取做CPlus,它的功能主要是实现两个数相加(多简单的一个类啊,这也要测试吗?不要紧,我们只是了解怎样加入测试代码来测试它就行了,所以越简单越好)。 假定这个类要实现的相加的方法是:
 
int Add(int nNum1, int nNum2);
 
Ok,那我们先来写测试这个方法的代码吧。TDD 可是先写测试代码,后写产品代码(CPlus)的哦!先写的测试代码往往是不能运行或编译的,我们的目标是在写好测试代码后写产品代码,使之编译通过,然后再进行重构。这就是Kent Beck说的“red/green/refactor”( 还记得基于GUI的测试环境的状态条吗?)。所以,上面的类名和方法应该还只是在你的心里,还只是你的idea而已。
 
2、在VC中为测试代码建立一个 Project
通常,测试代码和被测试对象是处于不同的Project中的。这样就不会让你的产品代码被测试代码所“污染 ”。
在本例中,我们将建立一个基于GUI 方式的测试环境。在VC中,我们建立一个基于对话框的Project。别忘了link正确的lib,本例中我们使用静态的CppUnit lib。由于我们希望这个Project运行后显示的是图2这样的界面,所以我们需要在App的 Instance()中屏蔽掉原有的对话框,代之以CppUnit的GUI。
 
CppUnit::MfcUi::TestRunner runner;
   runner.addTest(PlusTest::suite()); //添加测试
   runner.run(); //show UI
   /*
   CCPlusTestDlg dlg;
   m_pMainWnd = &dlg;
   int nResponse = dlg.DoModal();
   if (nResponse == IDOK)
   {
      // TODO: Place code here to handle when the dialog is
      // dismissed with OK
   }
   else if (nResponse == IDCANCEL)
   {
      // TODO: Place code here to handle when the dialog is
      // dismissed with Cancel
    }
   */
 
前面我们提到过,TestRunner输出图2这样的对话框,这也是前面我们为什么要为TestRunner.dll的路径设置环境变量的原因。
注意:PlusTest::suite()返回一个指向CppUnit::Test的指针.这个指针就是整个测试的起点。CppUnit::TestFactoryRegistry::getRegistry()根据TestSuite的名字返回TestFactoryRegistry工厂,然后调用工厂里的makeTest()对TestSuite进行组装,这是个递归调用,将建立起一个树状的测试结构。
 
namespace PlusTest
   {
       CppUnit::Test* suite()
       {
           CppUnit::TestFactoryRegistry &registry = 
           CppUnit::TestFactoryRegistry::getRegistry(plusSuiteName());
           return registry.makeTest(); 
       }
   }
 
另外别忘加头文件:
#include "CPlusTestSuite.h"
   #include <cppunit/ui/mfc/TestRunner.h>
   #include <cppunit/extensions/TestFactoryRegistry.h>
 
3、在Project中加入一个类,取名CPlusTestCase
CPlusTestCase从CppUnit::TestCase继承,代码如下:
 
class CPlusTestCase : public CppUnit::TestCase
   {
       CPPUNIT_TEST_SUITE(CPlusTestCase);
       CPPUNIT_TEST(testAdd);
       CPPUNIT_TEST_SUITE_END();
     public:
       CPlusTestCase();
       virtual ~CPlusTestCase();
       void testAdd(); //测试方法
   };
 
看到这几个宏了吗?它们可是在这大显身手了一把。
 
CPPUNIT_TEST_SUITE(CPlusTestCase);
CPPUNIT_TEST( testAdd );
CPPUNIT_TEST_SUITE_END();
 
通过这几个宏,我们就把CPlusTestCase和testAdd注册到了测试列表当中。
另外,我们需要在Cpp文件中加入另外一个宏:
 
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CPlusTestCase,PlusTest::plusSuiteName() );
 
它将CPlusTestCase这个TestSuite注册到一个指定的TestFactory工厂中,这个TestSuite用 PlusTest::plusSuiteName()函数返回的名字来标识(前面介绍的suite()函数中就是通过这个名字来获取这个工厂的)。plusSuiteName()是PlusTest这个namespace下的一个函数,它返回我们为这个TestSuite建立的名字(本例我们取名为“plus”)。其实我们也可以不用这么做,直接在宏里写入“plus“即可。但是这样可以防止硬编码带来的麻烦。
 
在测试类中,我们添加了一个测试方法:
 
void testAdd();
 
它测试的对象是前面提到的CPlus类的方法:
 
int Add(int nNum1, int nNum2);
 
我们来看看它的实现:
 
void CPlusTestCase::testAdd()
   {
        CPlus plus;
        int nResult = plus.Add(10, 20); //执行Add操作
         CPPUNIT_ASSERT_EQUAL(30, nResult); //检查结果是否等于30
   }
 
CPPUNIT_ASSERT_EQUAL是一个判断结果的宏。CppUnit中类似的其它宏请查阅TestAssert.h,本文在此不做详述 。
另外,我们还可以覆写基类的 setUp()、tearDown()两个函数。这两个函数实际上是一个模板方法,在测试运行之前会调用setUp()以进行一些初始化的工作,测试结束之后又会调用tearDown()来做一些“善后工作” ,比如资源的回收等等。当然,你也可以不覆写这两个函数,因为它们在基类里定义成了空方法,而不是纯虚函数。
 
另外,Cpp中要加入头文件:
#include "plusSuite.h"
 
4、根据测试代码编写产品代码
编写完上面的测试代码后,进行编译。编译肯定通不过,编译器会告诉我们CPlus类没有声明,因为我们还没有实现CPlus类呢!现在的工作就是马上实现CPlus类,让编译通过。现在你应该嗅到一点“测试驱动“的味道了吧?
 
在VC中建立一个MFC Extension Dll的Project,在这个Project 中加入类CPlus,它的声明如下:
 
class AFX_EXT_CLASS CPlus
   {
      public:
          CPlus();
          virtual ~CPlus();
      public:
          int Add(int nNum1, int nNum2);
  };

 

 
仅有一个方法,就是我们的测试代码要测试的那个方法。来看看它的实现:
 
int CPlus::Add(int nNum1, int nNum2)
   {
        return nNum1+nNum2;
   }
 
非常简单,不是吗?现在让前面那个包含测试代码的Project dependent这个Project,include 相关头文件 ,Rebuild All,你会发现编译已通过。你体会到了测试代码驱动产品代码了吗?当然我们的这个例子还很简单 ,没有重构这一步骤。
运行我们的测试程序,你就会看到如图6的界面:



图6

单击”Browse”, 如图7:


图7

这下你应该对前面我们说的TestSuite的名字理解更深了吧。plus是一个测试包TestSuite,它的下面包含一个测试用例,这个测试用例下面又包含一个测试方法。
 
至此,我们对CppUnit测试框架的应用作了一个详细的介绍,希望能对你在进行TDD过程中有所帮助。
 
参考资料:
CppUnit源码及说明文档
 
CppUnit测试框架入门(1)
 
 
cppunit原理分析以及例子 1、cppunit是什么 2、cppunit组成    在 CppUnit 中,一个或一组测试用例的测试对象被称为Fixture。Fixture 就是被测试的目标,可能是一个对象或者一组相关的对象,甚至一个函数。   有了被测试的Fixture,就可以对这个Fixture的某个功能、某个可能出错的流程编写测试代码,这样对某个方面完整的测试被称为TestCase。 阅读详情

相关推荐

开源单元测试库CppTest源码及测试程序

基于CppTest2.0.0版本,在Linux下直接make,不需要配置。

教你使用C++ test10.4.1做单元测试 续一

分析测试文件的结构 首先是包含头文件,#include “cpptest.h” 要用C++test提供的api 要用包含上面的头文件。 CPPTEST_CONTEXT(“Examples/ATM/Source Files/Account.cxx”); CPPTEST_TEST_SUITE_INCLUDED_TO(“Examples/ATM/Source Files/Account.cxx”); 上...

newstu1987的博客 1908

Cppunit-1.12.1以及测试框架模板实例Demo

含两个文件:Cppunit-1.12.1,以及CPPUNIT的测试框架模板实例Demo一个.相关使用方法详见我的优快云博文

C++test 学习(四)

BugDectective 和 BugDectective Aggressive BugDectective Aggressive 会report violation whose paths pass via inline assembly code。 覆盖率在测试配置中,Instrumention mode(检测方式):确定在执行期间测试用例的检测程度。full, full ru

AngelTempt的专栏 1354

CppUnit测试框架入门[汇编].pdf

CppUnit测试框架入门[汇编].pdf

Flutter蓝牙开发实战:flutter_blue_plus核心功能与实现原理剖析

本文深入剖析了Flutter蓝牙开发插件flutter_blue_plus的核心功能与实现原理。文章从源码解析入手,详细讲解了蓝牙状态管理、设备扫描、GATT连接、服务发现以及数据读写等关键流程的实现机制,并分享了实战中的性能调优与常见问题解决方案,帮助开发者高效构建跨平台蓝牙应用。

weixin_29014237的博客 444

CppTest单元测试框架(更新)

中讲述利用宏ADD_SUITE将测试用例自动增加到测试框架中。但在使用中发现一个问题,就是通过宏ADD_SUITE增加多个测试Suite时,每次运行时都是所有测试Suite都运行,有的Suite运行比较慢,这对边写测试用例边编译运行时效率很低。于是就在原来测试框架下作出修改,即默认运行所有测试用例,不过可以通过命令指定测试用例来运行

flysnow010的博客 1311

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6056

CppUnit使用教程以及原理分析

1.     CppUnit用法简介 1.1.            基本用法 1.1.1.      使用TestCase类创建测试用例 如下代码所示: //定义测试用例类 class SimpleTestCase:publicCPPUNIT_NS::TestCase { public:     virtual voidrunTest()     {         int

yuanhong2910的专栏 7585

XianYuAutoDeliveryX:基于闲鱼API与大模型的智能自动发货系统实践

本文详细介绍了如何利用XianYuAutoDeliveryX系统,结合闲鱼API与大语言模型,构建一个智能自动发货解决方案。该系统能实现买家付款后秒级自动发货,并通过对接ChatGPT等大模型智能回复买家咨询,有效解放卖家时间,提升虚拟商品店铺的运营效率和客户体验。

bush的博客 1019

企业数据治理体系中的AI与业务融合:架构师的3个成功案例

企业数据治理的痛点从来不是“有没有做”,而是“做了之后有没有用”——很多企业花了数百万建数据仓库、做元数据管理,最后却陷入“数据躺在库里睡大觉”“AI模型因数据质量差而失效”的困境。本文通过零售、金融、制造3个真实案例,拆解架构师如何用AI连接数据治理与业务场景:从“客户画像不准”到“精准推荐提升30%转化率”,从“欺诈检测漏报”到“实时拦截减少50%损失”,从“库存积压”到“供应链周转率提升20%”。如何让数据治理从「合规驱动」转向「价值驱动」?

AI 原生应用开发的博客 992

cppunit测试框架入门_开源C / C ++单元测试工具,第2部分,了解CppUnit

存档日期:2019年5月14日 | 首次发布:2010年1月12日 在有关开源单元测试实用程序系列的第二篇文章中,了解CppUnit,它是JUnit测试框架的C++端口。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。 随着技术的飞速发展,某些内容,步骤或插图可能已更改。 查看PDF文件 翻译自: https://www.ibm.com/developerworks/...

cusi77914的博客 228

46、搭建与配置FTP服务器全攻略

本文详细介绍了如何搭建与配置FTP服务器,以vsftpd为例,涵盖了FTP基础概念、安装步骤、服务控制、安全设置、用户权限管理、文件上传支持、互联网共享配置、客户端使用以及常见问题解决等内容。旨在帮助用户高效、安全地实现文件共享与管理。

time3的博客 88

CppUnit测试框架入门

测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分。XUnit,一个基于测试驱动开发的测试框架,它为我们在开发过程中使用测试驱动开发提供了一个方便的工具,使我们得以快速的进行单元测试。XUnit的成员有很多,如JUnit,PythonUnit等。

把握自己。 3183

嵌入式工程师成长之路(3)——PCB设计

带有目的的学:要知道,PCB板子做出来需要我们给厂家哪些东西,我们设计板子的时候,需要遵循哪些设计规范,防止画好也是块废板子。然后再逐步开始学习画板。

云轩阁 8万+

使用verilog实现基于FPGA的TDC设计

verilog实现TDC 高精度时间数字转换器概述(TDC) 简介: TDC被用于测量时间间隔,应用在物理研究、飞行时间测量领域等。 本设计使用verilog实现并在xilinx和altera的FPGA上均可实现! 设计中使用到下述几个模块,包括FIFO,COUNT等,在xilinx下也使用到了一些原语等。下面有实现的代码和仿真截图等。 顶层模块设计如下: module top( input wire start, input wire stop, input wire clk, output wire T

QQ_778132974的博客 6254

CppUnit测试框架使用笔记一

对新框架的学习,一种比较自然的方法就是直接使用,看到运行结果,跟踪运行过程,了解框架的运行流程。就像学习各种编程语言一样,每本书上来都是“Hello world“,那么我的学习过程也是以直接使用框架开始。 1、编译CppUnit框架,获得相关的导出库文件和运行时库文件 2、设置相关的vs工程 3、建立自己的测试框架和测试用例 4、运行测试用例 5、分析用例的执行过程,获得感性上的认识

追寻自己 2853

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1004

CppUnit测试框架中的异常判断宏

TestAssert (名字空间中Assert函数集合) 说明: 在CppUnit的名字空间中的全局的判定(Assert)函数,提供了多样的判断方法。 预定义宏: (1)  CPPUNIT_ASSERT(condition) 测试目的:判断condition是否为true,如果是false则抛出异常 在进行单元测试的时候用到的最多的测试宏,判断条件condition是true还是f

追寻自己 1347

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

cppunit

一、前言  测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分。XUnit,一个基于测试驱动开发的测试框架,它为我们在开发过程中使用测试驱动开发提供了一个方便的工具,使我们得以快速的进行单元测试。XUnit的成员有很多,如JUnit,Pyth

shepherd02的专栏 2096

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: CppUnit测试框架入门(1)
下一篇: 包的设计原则
cpluser
博客等级 码龄22年 48粉丝 61原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值