文档章节

CppUnit学习笔记

临峰不畏
 临峰不畏
发布于 2015/05/01 12:12
字数 815
阅读 757
收藏 3

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

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

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

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

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

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



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

安装

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

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 &registry = \
             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 子类。


© 著作权归作者所有

临峰不畏
粉丝 221
博文 187
码字总数 98583
作品 0
深圳
架构师
私信 提问
Win32平台如何配置才能使用Boost、ACE、CppUnit

本博客(http://blog.csdn.net/livelylittlefish )贴出作 者(三二一@小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Win32平台如何配置才能使用Boost、ACE、CppUnit 1. 环境变量...

晨曦之光
2012/03/09
757
0
CppUnit测试框架入门

测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测 试能够通过,然后再优化设计结构。测试驱动开发式是...

红薯
2009/07/29
1K
0
Using CppUnit

The arcticle of codeproject is very clear about using CppUnit. http://www.codeproject.com/library/Using_CPPUnit.asp But I will speak about some important issues about the upon a......

长平狐
2012/08/28
188
0
开放源码 C/C++ 单元测试工具,第 2 部分: 了解 CppUnit

本文介绍非常受欢迎的 CppUnit — 最初由 Eric Gamma 和 Kent Beck 开发的 JUnit 测试框架的 版本。 版本由 Michael Feathers 创建,它包含许多类,有助于进行白盒测试和创建自己的回归测试套...

小编辑
2010/02/26
1K
0
关于Cppunit单元测试的重构

linux cppunit 单元测试 如果边开发边写单元测试,感觉还行,工作量不大, 但是代码写完了,在回头补单元测试,感觉好累,写的代码比开发时候还多,,, 所以大家有什么办法重构下CPPUNIT_T...

陈舵主
2012/12/19
343
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud 笔记之Spring cloud config client

观察者模式它的数据的变化是被动的。 观察者模式在java中的实现: package com.hxq.springcloud.springcloudconfigclient;import org.springframework.context.ApplicationListener;i...

xiaoxiao_go
昨天
6
0
CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部