博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cppunit使用详解
阅读量:5879 次
发布时间:2019-06-19

本文共 3686 字,大约阅读时间需要 12 分钟。

cppunit使用详解

第一步:如何安装 (我的运行环境: fc7 Linux, gcc4)

    cppunit 的安装是相当标准的linux的安装过程
    a. 下载cppunit的源文件
    b. 解压缩
    c. 编译安装程序
      $./configure --prefix=/data/soft/cppunit-1.12
      $make
      $make install
    这里 -prefix=/data/soft/cppunit-1.12 的意思是把安装的根目录设置为 /data/soft/cppunit-1.12
    安装完成以后头文件存储在/data/soft/cppunit-1.12/include,库文件存储在/data/soft/cppunit-1.12/lib。
    因为不是安装在默认的位置所以在编译和连结的时候要指定路径。
    例如:g++ -g -L/data/soft/cppunit-1.12/lib -lcppunit -ldl -I/data/soft/cppunit-1.12/include Main.C
注意这里的几个 -l选项, 尤其是 -ldl 选项。

    第二步: 下面我介绍一下个人认为比较实用的测试程序的结构。

    这个测试类从CppUnit::TestFixture派生,并且由下面的部分组成:
    a. setUp() 方法
       在这个方法里实现一些准备工作,例如生成一些被测类的实列
       setUp(){
             m_vertex = new Vertex( 'V' );
       }
    b. tearDown() 方法
       在这个方法里实现扫尾的工作,例如释放内存
       tearDown(){
          //一些在setUp方法中申请的内存的清理工作
          delete m_vertex;
       }
    c. 测试方法的方法
       例如,在被测类里有一个方法叫做:bool operator==(MyComplex &a), 我们
    要写一个名字叫作test_Equality的方法来测试。
      void GraphTest::testConstructor()
 {
     CPPUNIT_ASSERT( m_vertex->label == 'V' );
     CPPUNIT_ASSERT( m_vertex->wasVisited == true );
     CPPUNIT_ASSERT( m_vertex->isInTreeVerts == true );
 }
    CPPUNIT_ASSERT用来判断里面的表达是是否为真。
    d. 把几个测试方法“打包”为一个suite。
      CppUnit::TestSuite *suite= new CppUnit::TestSuite();
     suite->addTest(new CppUnit::TestCaller<GraphTest> ("testConstructor", &GraphTest::testConstructor));
    测试类就是由这些方法组成。

 e. 运行测试用例

 CppUnit::TextUi::TestRunner runner;
    runner.addTest( suite ); //指定运行TestSuite
 //开始运行, 自动显示测试进度和测试结果
    runner.run( "", true );

下面通过完整的源代码展现cppunit的使用方法。

// file1 : dijkstra.h 该头文件中含有下面代码,现在我们要使用cppunit对构造函数进行测试
#ifndef DIJKSTRA_H
#define DIJKSTRA_H
struct Vertex
{
public:
    char label; // label (e.g. 'A')
    bool wasVisited;
    bool isInTreeVerts;
    
    Vertex( char lab ) // constructor
    {
        label = lab;
    }
}; // end struct Vertex
#endif
// file2 : GraphTest.h
#include "dijkstra.h"
#include "cppunit/TestFixture.h"
class GraphTest : public CppUnit::TestFixture {
protected:
    Vertex * m_vertex;
public:
    GraphTest() {
}
    // 初始化函数
    void setUp ();
    // 清理函数
    void tearDown();
    
    // 测试构造函数的测试函数
    void testConstructor ();
    //还可以添加新的测试函数
};
// file3 : GraphTest.cpp
#include "GraphTest.h"
#include "cppunit/TestAssert.h"
void GraphTest::setUp()
{
    m_vertex = new Vertex( 'V' );
}
void GraphTest::tearDown()
{
    delete m_vertex ;
}
void GraphTest::testConstructor()
{
    CPPUNIT_ASSERT( m_vertex->label == 'V' );
    CPPUNIT_ASSERT( m_vertex->wasVisited == true );
    CPPUNIT_ASSERT( m_vertex->isInTreeVerts == true );
}
// file4: main.cpp
#include "GraphTest.h"
#include "cppunit/ui/text/TestRunner.h"
#include "cppunit/TestCaller.h"
#include "cppunit/TestSuite.h"
int main()
{
    CppUnit::TextUi::TestRunner runner;
    CppUnit::TestSuite *suite= new CppUnit::TestSuite();
    // 添加一个测试用例
    suite->addTest(new CppUnit::TestCaller<GraphTest> ("testConstructor", &GraphTest::testConstructor));
    runner.addTest( suite ); //指定运行TestSuite
 
    //开始运行, 自动显示测试进度和测试结果
    runner.run( "", true ); }

好了。都准备好了,编译:

[root@zieckey cppunit]# g++ GraphTest.cpp main.cpp -lcppunit -I /data/soft/cppunit-1.12/include/ -L /data/soft/cppunit-1.12/lib

/data/soft/cppunit-1.12/lib/libcppunit.so: undefined reference to `dlsym'
/data/soft/cppunit-1.12/lib/libcppunit.so: undefined reference to `dlopen'
/data/soft/cppunit-1.12/lib/libcppunit.so: undefined reference to `dlclose

这个错误是由于没有找到 dlsym 等函数的链接库,制定下他们的连接库:

[root@zieckey cppunit]# g++ GraphTest.cpp main.cpp -lcppunit -I /data/soft/cppunit-1.12/include/ -L /data/soft/cppunit-1.12/lib -ldl

编译成功,运行:

[root@zieckey cppunit]# ./a.out

.F
!!!
Test Results:
Run: 1 Failures: 1 Errors: 0
1) test: testConstructor (F) line: 17 GraphTest.cpp
assertion failed
- Expression: m_vertex->wasVisited == true
<RETURN> to continue

发现一个错误,构造函数没有按照我们想象的对成员变量 wasVisited 初始为 true

从而发现一个错误,修改 Vertex 的构造如下:    

Vertex( char lab ) // constructor

    {
        label = lab;
        wasVisited = true;
        isInTreeVerts = true;
    }

再次编译,运行,通过测试。

转载地址:http://fddix.baihongyu.com/

你可能感兴趣的文章
【翻译自mos文章】当并行事务恢复进程在执行时,禁用并行事务恢复的方法
查看>>
VUE -- 如何快速的写出一个Vue的icon组件?
查看>>
31.Node.js 常用工具 util
查看>>
服务器的svnserver修改密码
查看>>
利用 fdisk进行分区
查看>>
WPF 实现窗体拖动
查看>>
来自维基百科程序员Brandon Harris
查看>>
NULL不是数值
查看>>
CentOS 5 全功能WWW服务器搭建全教程
查看>>
30个优秀的后台管理界面设计案例分享
查看>>
scala111
查看>>
模块化服务规范——OSGI
查看>>
劣质代码评析——猜数字问题(上)
查看>>
纸上谈兵: 栈 (stack)
查看>>
Windows phone8 基础篇(三) 常用控件开发
查看>>
Oracle学习笔记之五,Oracle 11g的PL/SQL入门
查看>>
PHP安全编程:register_globals的安全性 全局变量注册(转)
查看>>
工程技巧Linux上建立工程项目
查看>>
Linux php 中文乱码解决
查看>>
pjsip视频通信开发(上层应用)之拨号键盘下部份拨号和删除功能
查看>>