zoukankan      html  css  js  c++  java
  • cppunit使用详解

    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;
        }

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

  • 相关阅读:
    《七哥说道》第五章:入职惨做苦力,画饼一望无际
    《七哥说道》第四章:理想在远方,现实在流浪
    《七哥说道》第三章:志远淋雨怒辞职,误入保险黄老萍
    《七哥说道》第二章:初出茅庐之拜师学艺
    (十)redis源码解读
    (三十二)线上调优
    (三)栈
    (一)设计模式之代理模式
    Linux whereis、find和locate命令区别以及应用场景
    使用自定义注解和AOP管理shiro权限
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/4515729.html
Copyright © 2011-2022 走看看