使用CppUnit进行单元测试

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

一. CppUnit的安装

      从http://sourceforge.net/projects/cppunit   CppUnit的源码包. CppUnit是开源产品 , 当前最高版本为1.11.0. (在上面的链接所指向的页面上选择 Development Snapshot ).

       下载后,将源码包解压缩到本地硬盘. 以C:为例, 解压到C:/CppUnit-1.11.0 .  接下来进行编译工作. 在src/目录下, 将CppUnitLibraries.dsw工程文件用vc 打开.  因为这个工程是vc6建的工程, 所以会提示是否将此工程转为vc.net的工程格式. 选择"全是"就行.  然后在"生成"菜单中选择"生成解决方案",编译整个工程.

        编译通过以后, 在lib/目录下,会生成若干lib,和dll文件, 都以cppunit开头. cppunitd表示debug版, cppunit表示release版.

        然后配置vc环境:  工具菜单->选项->项目->vc++目录, 将C:/cppunit-1.11.0/include加入到vc 的 头文件目录中. 将C:/cppunit-1.11.0/lib 加入到vc的 连接库目录中. 然后将 C:/cppunit-1.11.0/lib路径加入到系统路径中(因为我们的测试程序需要cppunit的dll文件,所以要dll所在路径加入到系统路径(path)变量中, 或者将这些文件拷贝到系统目录中也可以).

二. CppUnit 的使用

       以上工作完成以后,就可以正式使用CppUnit了.

        我们新建一个控制台工程, 假定工程名为TDD1. 假设我们将在这个工程下开发, 那么根据测试驱动的原理,我们需要先建立一个单元测试框架.  在CppUnit下, 可以选择控制台方式和UI方式两种表现方案.我们选择UI方式.  那么现在在原来工程的基础上,再新增加一个对话框工程. 假设名为:Unit_Test .

        在CppUnit中, 是以TestCase为最小的测试单位, 若干TestCase组成一个TestSuite. 所以我们要先建立一个TestCase.

        新建一个类, 命名为CTestCase , 让其从CppUnit::TestCase派生.  为其新增一个方法,假设为 void doTest(); 我们将在这个函数中写入我们的一些测试代码.  切记要包含头文件

#include <CppUnit/extensions/HelperMacros.h>


class CTestCase : public CppUnit::TestCase
{
public:
    CTestCase(void);
    ~CTestCase(void);
    void doTest();
};

接下来, 我们要对我们的TestCase进行声明. 声明用到了三个宏.  

    CPPUNIT_TEST_SUITE();
    CPPUNIT_TEST();
    CPPUNIT_TEST_SUITE_END();

第一个宏声明一个测试包,第二个宏声明一个测试用例. 现在我们的CTestCase类看上去象这样.

class CTestCase : public CppUnit::TestCase
{
    CPPUNIT_TEST_SUITE(CTestCase);
    CPPUNIT_TEST(doTest);
    CPPUNIT_TEST_SUITE_END();
public:
    CTestCase(void);
    ~CTestCase(void);
    void doTest();
};

接下来,我们要注册我们的测试suite. 使用CPPUNIT_TEST_SUITE_NAMED_REGISTRATION()来注册一个测试suite. 这个宏的第二个参数是我们注册的suite的名字. 在这里我们可以用字符串来代替, 但我们用一个静态函数来返回这个suite的名字.

    //TestCase.h 

    static std::string getSuiteName();

    //TestCase.cpp

    std::string CTestCase::getSuiteName()
    {
            return "TDDExample3";
    }

    记得要在TestCase.h中包含 #include <string>

    然后在 TestCase.cpp注册我们的suite.

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTestCase , CTestCase::getSuiteName() );

     接下来我们写一个注册函数, 使其在运行期生成一个Test.

    

    static CppUnit::Test* getSuite();

    CppUnit::Test* CTestCase::getSuite()
    {
           CppUnit::TestFactoryRegistry& reg =
                 CppUnit::TestFactoryRegistry::getRegistry  ( CTestCase::getSuiteName() );
                 return reg.makeTest();
      }

      记住包含头文件:

       #include <cppunit/extensions/TestFactoryRegistry.h>

       最后, 我们的单元测试建立一个UI测试界面.

       我们在CUnit_TestApp::InitInstance()函数中,将原先显示主对话框的代码以下面的代码取代:

    CppUnit::MfcUi::TestRunner runner;
    runner.addTest(CTestCase::getSuite());
    runner.run();

    必须先包含头文件:

#include <cppunit/ui/mfc/TestRunner.h>
#include "TestCase.h"
    到此为止, 我们已经建立好一个简单的单元测试框架. 我们可以在doTest()中加入我们的测试代码,来进行测试了. CppUnit会将测试结果通过一个界面显示出来.

     但此时我们虽然能编译通过,但在连接时会发生错误. 所以将下面两个库加入到工程中. 也可以在TestCase.h 中显式的加入:

#pragma comment(lib,"cppunit.lib")
#pragma comment(lib,"testrunnerd.lib")

   下面是完整的程序清单:

     //TestCase.h

#pragma once

#include <string>

#include <CppUnit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/Asserter.h>

#pragma comment(lib,"cppunit.lib")
#pragma comment(lib,"testrunnerd.lib")

class CTestCase : public CppUnit::TestCase
{
    CPPUNIT_TEST_SUITE(CTestCase);
    CPPUNIT_TEST(doTest);
    CPPUNIT_TEST_SUITE_END();
public:
    static std::string getSuiteName();
    static CppUnit::Test* getSuite();

public:
    CTestCase(void);
    ~CTestCase(void);
    void doTest();
};

//TestCase.Cpp

#include "StdAfx.h"
#include "./testcase.h"

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTestCase , CTestCase::getSuiteName() );

CTestCase::CTestCase(void)
{
}

CTestCase::~CTestCase(void)
{
}

void CTestCase::doTest()
{
}


std::string CTestCase::getSuiteName()
{
    return "TDDExample3";
}

CppUnit::Test* CTestCase::getSuite()
{
    CppUnit::TestFactoryRegistry& reg =
        CppUnit::TestFactoryRegistry::getRegistry( CTestCase::getSuiteName() );
    return reg.makeTest();
}

//Unit_Test.cpp

#include <cppunit/ui/mfc/TestRunner.h>
#include "TestCase.h"

BOOL CUnit_TestApp::InitInstance()
{

 InitCommonControls();

 CWinApp::InitInstance();

 AfxEnableControlContainer();

   CppUnit::MfcUi::TestRunner runner;
    runner.addTest(CTestCase::getSuite());
    runner.run();

 return FALSE;
}

现在编译,运行, 如图一:

进度条呈现绿色, 表示我们此次测试通过. 事实上我们的doTest是一个空函数,什么代码也没有写,当然能通过了. :)

     下面我们在doTest()中加点代码进去.

      char* p = NULL; p[0]='c';

     这段代码会引起一个访问异常. 看UnitCpp怎么来报告这段代码的错误. 

编译,运行如图2:



这时CppUnit会告诉我们dotest出现一个错误. 并提供了错误的一些信息.

          这样我们用CppUnit搭建一个简单单元测试框架.

参考文章:

   CppUnit测试框架入门 

  作者Blog http://blog.youkuaiyun.com/cpluser/

 
CPPUNIT单元测试 -- 测试程序模板 CPPUNIT单元测试 -- 测试程序模板 在此基础上, 可以增添其他测试代码 立即下载

相关推荐

cppunit单元测试

cppunit进行单元测试框架构建与gtest的单元测试框架构建

用CPPUnit做单元测试

用CPPUnit做单元测试 例子程序下载:http://www.codeproject.com/library/Using_CPPUnit/my_tests.zip CPPUnit最新版本免费下载: http://cppunit.sourceforge.net/ CPPUnit是基于C++的单元测试框架,可以有效提高开发的系统质量。 引言: QA过程常采用两种测试方法: 1、单元测试

Monday2204的专栏 1011

freeswitch之呼叫中心acd模块开发

一、定义: ACD(Automatic Call Distributor) 自动呼叫分配,也叫智能选择座席。它是呼叫中心整个前台接入系统逻辑功能的描述:把接入的呼叫转接到正确的座席员桌前。ACD是现代呼叫中心有别于一般的热线电话系统和自动应答系统的重要标志,其性能的优劣直接影响到呼叫中心的效率和顾客的满意度。 二、ACD包含的功能点: 1 、程控交换功能 ACD在本质上也是交换机的一种类型,必须具有程控交换最基本的话务交换功能。 2 、排队功能 ACD必须具有话务排队的功能,所谓排队是指在内线都

飞鸟的博客 1870

在C++学习的过程中如何使每个 .cpp单独运行

在日常的学习中我们可能会在同一个项目下建立多个cpp文件进行C++的学习,如果要使每个cpp文件都可以单独运行,不会报错应该怎么做。 以下有两种方法可以解决: 方法一 将其他不需要运行的 .cpp文件中的main函数(主函数)全部注释掉。不需要运行的main函数全部注释掉,需要用到那个就解开那个的注释,非常方便。 ** 方法二 ** 弹出这样一个界面 点击这个V形字样的按钮 选择是即可 ...

qq_46906413的博客 8808

从5V降到3.3V,你的LDO到底有多烫?手把手算功耗、选散热,避开这些坑

本文详细解析了LDO在5V转3.3V电路中的发热问题,提供了精确的功耗计算公式和散热设计方法。通过对比不同封装的热阻参数和优化PCB布局,帮助工程师有效降低LDO温度,避免热保护触发。文章还探讨了替代方案的技术拐点,为电源系统优化设计提供实用指导。

weixin_30304375的博客 436

从零搭建Obsidian智能知识库:Ollama本地模型与Copilot插件实战指南

本文详细介绍了如何从零搭建Obsidian智能知识库,结合Ollama本地模型与Copilot插件实现高效知识管理。通过本地部署AI助手,用户可以在保证隐私安全的同时,快速检索和整理笔记,提升工作效率。文章涵盖硬件准备、Ollama部署、插件配置及实战技巧,适合需要高效知识管理的专业人士。

weixin_29230773的博客 631

CPPUNIT 使用学习(一)

从网上下载了cppunit-1.12.1后,发现网上关于cppunit的使用方式说的有些问题,因此将自己使用的方式总结一下,当前只是简单使用。1 使用继承自TestFixture的单元测试类 1.1 testPlannaer.hpp #include &lt;cppunit/extensions/HelperMacros.h&gt; #include &lt;cppunit/TestFixture...

guomingbing12的专栏 1527

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 256

Linux下使用CppUnit组织单元测试

本文介绍CppUnit单元测试的一些基础知识和使用方法,其中的一些样例来自于源码,安装和一些基础介绍也可以参见文献[1,2]。

cjf_wei的博客 1496

高级Salesforce开发面试题

自定义设置允许您创建自定义数据集,以及为组织、配置文件或特定用户创建和关联自定义数据。自定义元数据类似于自定义设置,但是自定义元数据类型中的记录被视为元数据而不是数据。自定义设置有列表和层次自定义设置两种。自定义元数据中没有此类类型。此外,自定义元数据不支持基于用户配置文件或特定用户的层次结构类型的数据。自定义设置现在不再支持关系字段。但您可以在自定义元数据对象之间创建查找。元数据查询不占用查询sql次数的限制。

weixin_45663522的博客 1242

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2237

C++单元测试工具之CPPUnit使用

C++单元测试工具之CPPUnit使用 - IT_cnblogs - 博客园

littleline的专栏 87

看完这篇你就能讲解LLC软开关:一文秒懂 ZVS 和 ZCS 到底啥意思!

想要 MOS 管ZVS 好实现➜ 把工作频率保持在 fr1 或更高。想让整流二极管也ZCS 实现➜ 频率就别高过 fr1。设计磁性元件时,一定要计算好 Lr、Lm、Cr 的值,这直接决定你 fr、fr1 是多少!LLC 的软开关技术不是“魔法”,是电感电容+频率控制的精妙组合;fr1 就像黄金分割点,整流和开关都能“刚刚好”;不是所有软开关都能同时实现,要看你在频率曲线的哪一段!

weixin_43199439的博客 1539

使用CPPUnit执行C/C++单元测试

Windows环境下,使用CPPUnit执行C/C++单元测试,支持VS2013/VS2015/VS2017/VS2019开发环境,支持x86和x64。

geriletuma 1559

解决群晖NAS无法拉取docker镜像问题

在2024-06-01日以前,使用SSH登录后是可以直接拉取docker镜像的;但是之后当我们使用SSH登录上群晖NAS,使用【sudo -i】切换到超管拉取镜像会提示报错【error pulling image configuration: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/cf/cff6b68a194a672fd337d8728bfb252071012cce6

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++单元测试工具CppUnit使用简介

C++单元测试工具CppUnit使用简介准备工作:    1. 到 http://sourceforge.net/projects/cppunit/下载CppUnit测试框架的源代码    2. 解压文件,进入src文件夹,打开CppUnitLibraries.dsw。分别编译这两个project,输出位置均为lib文件夹。     3.在VC的tools/options/dire

1772

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++单元测试工具CppUnit使用简介 【转载】

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!陈希章 原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/06/05/1496634.html原文标题:C++单元测试工具Cp

陈希章@中国 614

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VS2005下使用CPPUNIT进行单元测试(全过程)

一、单元测试与CPPUNIT简介  几乎每个开发人员都写过测试代码,但是往往这些代码不系统,也没有良好的管理,同时在测试代码编写过程中也有很多重复的劳动,比较繁琐。在一个软件开发过程中,往往会进行很多修改,迭代开发的模型随处可见,如何验证程序的功能、性能和结构是否符合要求是一项重要的工作。  单元测试是属于白盒测试和结构性测试,一般由开发人员开展,当然如果有好的测试工具支持,测试人员甚至最

孟游的专栏 766
上一篇: CppUnit使用简介
下一篇: 深入浅出单元测试
workdog
博客等级 码龄20年 40粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值