CppUnit学习笔记

今天是五一劳动节,为了不为全国人民添堵,本人还是决定宅在家里学点东西。

C++里的单元测试工具我接触过的有boost_unit,gtest。

本人深知单元测试的重要性与TDD(测试驱动开发)的思想。所以,测试工具对我而言开发利器。我们必须要掌握其中的一门。

听说CppUnit的兼容性比较好,于是博主就颇有兴趣地学习了一下CppUnit的使用。

网上的资料很多,已有很多牛人已做了分享。

CppUnit入门CppUnit百科CppUnit使用详解,等等。在百度上搜“CppUnit”,有很多资料。



本人参照上面的示例自己尝试做了一遍。

安装

首先是安装cppunit。本人的系统是CentOS,就直接用yum安装使是。

?


1

sudo yum install cppunit-devel

也可以选择下载源码安装。步骤大致都是:解压缩,./configure,make,sudo make install。

安装完成之后,在 /usr/include 路径下会多一个 cppunit 目录,这就是cppunit的头文件所在处。在 /usr/lib/ 路径下有 libcppunit-1.12.so.1      libcppunit-1.12.so.1.0.0  libcppunit.so 3个文件。

我们在链接的时候,一定要记得加 -lcppunit 项。

Lession-1

编辑文件:MathTest.h

#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>

class MathTest : public CppUnit::TestFixture
{
protected:
    int m_value1, m_value2;
public:
    MathTest() {}
    void setUp () {
        m_value1 = 2;
        m_value2 = 3;
    }

    void testAdd() {
        int result = m_value1 + m_value2;
        CPPUNIT_ASSERT(result == 5);
    }
    void testSub() {
        int result = m_value1 - m_value2;
        CPPUNIT_ASSERT(result == 0);
    }
};

编译文件:TestMain.cpp

#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/TestSuite.h>
#include <cppunit/TestCaller.h>
#include "MathTest.h"

int main(int argc, char **argv)
{
    CppUnit::TextUi::TestRunner runner;
    CppUnit::TestSuite *suite = new CppUnit::TestSuite();

    suite->addTest(new CppUnit::TestCaller<MathTest>\
            ("testAdd", &MathTest::testAdd));

    suite->addTest(new CppUnit::TestCaller<MathTest>\
            ("testSub", &MathTest::testSub));

    runner.addTest(suite);

    runner.run("", true);
    return 0;
}

编译命令:

$ g++ -o test TestMain.cpp -lcppunit

执行结果:

[hevake_lcj@localhost Lession1]$ ./test
..F

!!!FAILURES!!!
Test Results:
Run:  2   Failures: 1   Errors: 0

1) test: testSub (F) line: 21 MathTest.h
assertion failed
- Expression: result == 0

<RETURN> to continue

总结:

在这个例程中,我们自定义了 CppUnit::TestFixture 子类 MathTest 。在MathTest可选择性地定义 setUp() 与 tearDown() 

还需要手动将其加入到 TestSuite对象中去。将 TestSuite对象加入到TestRunner中才能进行测试。

要添加一个测试,需要改TestMain.cpp文件。这样的测试框架不易维护。

Lession-2

CppUnit 一定考虑到了Lession-1的问题,并提供了许多宏定义,使我们的测试代码更可读。如下是示例:

编辑文件:DemoTest.h

#ifndef __DEMO_TEST_H__
#define __DEMO_TEST_H__

#include <cppunit/extensions/HelperMacros.h>

class DemoTest : public CppUnit::TestFixture
{
    CPPUNIT_TEST_SUITE(DemoTest);
    CPPUNIT_TEST(testFunc);
    CPPUNIT_TEST_SUITE_END();

public:
    void setUp();
    void tearDown();

    void testFunc();
};

#endif //__DEMO_TEST_H__

编辑文件:DemoTest.cpp

#include "DemoTest.h"
#include <iostream>
#include <cppunit/extensions/HelperMacros.h>

using namespace std;

CPPUNIT_TEST_SUITE_REGISTRATION(DemoTest);

void DemoTest::setUp()
{
    cout << "DemoTest::setUp()" << endl;
}

void DemoTest::tearDown()
{
    cout << "DemoTest::tearDown()" << endl;
}

void DemoTest::testFunc()
{
    cout << "DemoTest::testFunc()" << endl;
    CPPUNIT_ASSERT(12 == 11+1);
}

编辑文件:TestMain.cpp

#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

int main(int argc, char **argv)
{
    CppUnit::TextUi::TestRunner runner;
    CppUnit::TestFactoryRegistry istry = \
             CppUnit::TestFactoryRegistry::getRegistry();
    runner.addTest(registry.makeTest());
    runner.run();
    return 0;
}

编译命令:

$ g++ -o test DemoTest.cpp TestMain.cpp -lcppunit

执行结果:

[hevake_lcj@localhost Lession2]$ ./test
.DemoTest::setUp()
DemoTest::testFunc()
DemoTest::tearDown()

OK (1 tests)

总结:

我想,其大概的原理就是在 CPPUNIT_TEST_SUITE_REGISTRATION(TestDemo) 宏中就定义了一个全局的 TestDemo 对象,在该 TestDemo 的构造函数中 将自己添加到了 单例 CppUnit::TestFactoryRegistry 中。所以在 main() 函数中调用 CppUnit::TestFactoryRegistry::getRegistry() 时就可以获得所有我们自己定义的 CppUnit::TestFixture 子类。

时间: 2024-10-21 16:54:37

CppUnit学习笔记的相关文章

JetSpeed学习笔记(一)

笔记 JetSpeed学习笔记(一) fuweilin 2005-4-7 前言 参加了公司的portal的兴趣小组,今天对portal进行学习.首先上网看了看一些portal的资料,对portal.portlet.portlet container以及JSR168等概念有个基本的了解.决定进一步实战的方式感受portal,于是学习JetSpeed.     1.  JetSpeed介绍JetSpeed是Apache组织开发的一个采用Java和XML的开放源代码的企业信息门户的实现.门户可以让终端

PHP输入输出流学习笔记

  这篇文章主要介绍了PHP输入输出流学习笔记,PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符,内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器,需要的朋友可以参考下 PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符, 内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器. php://stdin, php://stdout 和 php://std

PHP学习笔记 (1) 环境配置与代码调试

一配置PHP环境 1.了解什么是PHP PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写) PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用 2.PHP的背景和优势 PHP的发展背景 1).1994年由Rasmus Lerdorf创建,开始是一个简单的Perl语言编写的程序,用统计

Node.js 学习笔记之简介、安装及配置

 本文是Node.js学习笔记系列文章的第一篇,主要给大家讲解的是在Windows和Linux上安装Node.js的方法.软件安装版本以0.12.0为例.希望大家能够喜欢.     简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 谁适合阅

node.js学习笔记(9) 和谐模式

众所周知,ECMAScript 是一种开放的.国际上广为接受的脚本语言规范. 它本身并不是一种脚本语言.正如在 Web 应用程序中执行有用操作的 bean 集合(例如,Netscape 的 AWT)是 Sun 的 JavaBean 规范的一种实现一样,JavaScript 是 ECMAScript 规范的一种实现. 2015年6月17日,ECMA国际发布了EcmaScript2015,即EcmaScript6(以下简称ES6)草案的正式版.ES6是继ES5之后的一次主要改进,语言规范由ES5.1

php5学习笔记(转)

php5|笔记 作者: whhwq在phpv.net看到的感觉不错/*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有

动态网页学习:JSP学习笔记全记录

js|笔记|动态|网页 JSP学习笔记(一)-----概述 JSP学习笔记(二)-----使用Tomcat运行JSP文件 JSP学习笔记(三)-----使用JSP处理用户注册和登陆 JSP学习笔记(四)-----JSP动作的使用 JSP学习笔记(五)-----JSP中使用JavaBean JSP学习笔记(六)-----在多个JSP页面之间传递参数 JSP学习笔记(七)-----猜数字游戏 JSP学习笔记(八)-----include的运用 JSP学习笔记(九)-----JSP标签库

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

Java的“对象思想”学习笔记[二]

笔记|对象 在这篇文章里我将介绍一些Java对于对象的基本处理模式的问题. 首先看一个有关对象相等性(Object equivalence)的例子: 先看下面的代码: public class EqualTest1{ public static void main(String[] args){ Integer n1 = new Integer(20); Integer n2 = new Integer(20); System.out.println(n1 = = n2); System.out