zoukankan      html  css  js  c++  java
  • 简单易懂的单元测试框架-gtest(一)


    简介

        gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用。该框架以第三方库的方式插入被测代码中。同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试。同时,gtest还支持通过事件机制为这些测试样例添加不同级别的挂钩函数。


    gtest安装

        在ubuntu中安装gtest的指令如下,该指令包含了下载源码、编译和安装的过程:

    sudo apt-get install libgtest-dev
    cd /usr/src/gtest
    sudo cmake CMakeLists.txt
    sudo make
    sudo cp *.a /usr/lib

        由于下载的gtest是源文件,所需要自己编译成库文件(静态库),再复制到用户库目录下。在程序的链接阶段,这些静态库中的相应函数会修改后插入到程序中(这里的修改指进行地址替换)。


    Hello World

        这里将演示一个基础的单元测试例子。这里的被测试函数为checkOdd。我们创建一个测试集,测试集合包含了两个小测试,分别测试了checkOdd函数是否能正确判断奇数。每个小测试内部包含几个断言语句。

    /* 一个简单的单元测试示例 */
    #include <gtest/gtest.h>
    
    // 待测函数,作用是检查输入是否为奇数
    bool checkOdd(int a){
      return a%2==1;
    }
    // 测试集checkOddTest的测试1
    TEST(checkOddTest, test1){
      ASSERT_EQ(true, checkOdd(1));
      ASSERT_EQ(true, checkOdd(11));
    }
    // 测试集checkOddTest的测试2
    TEST(checkOddTest, test2){
      ASSERT_EQ(false, checkOdd(2));
      ASSERT_EQ(false, checkOdd(12));
    }
    
    int main(int argc, char **argv){
      testing::InitGoogleTest(&argc, argv);
      return RUN_ALL_TESTS();
    }
    

        上述代码就构成了一个完整的单元测试程序。为了编译上述代码,需要将gtest的头文件目录和库文件位置加入g++的搜索目录中。本文制作了一个cmake配置文件CMakeLists.txt来完成上述过程,内容如下,

    cmake_minimum_required(VERSION 2.6)
    
    # Locate GTest
    find_package(GTest REQUIRED)
    include_directories(${GTEST_INCLUDE_DIRS})
    # Compile Object
    add_executable(runTests test.cc)
    target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
    add_custom_command(TARGET runTests
                       POST_BUILD
                       COMMAND ./runTests
    )
    

        上述代码除了配置编译的搜索目录外,还添加了一个客制命令。这里的add_custom_command为目标runTests添加了一个客制命令,其作用是在runTests构建后执行命令"./runTests"。这条命令作用在于,当单元测试编译结束时,顺便就运行这个单元测试程序。是一个方便的小技巧。运行如下指令,开始编译和单元测试过程:

    cmake CMakeLists.txt
    make

        运行结果为,

    Scanning dependencies of target runTests
    [ 50%] Building CXX object CMakeFiles/runTests.dir/test.cc.o
    [100%] Linking CXX executable runTests

    [==========] Running 2 tests from 1 test case.
    [----------] Global test environment set-up.
    [----------] 2 tests from checkOddTest
    [ RUN ] checkOddTest.test1
    [ OK ] checkOddTest.test1 (0 ms)
    [ RUN ] checkOddTest.test2
    [ OK ] checkOddTest.test2 (0 ms)
    [----------] 2 tests from checkOddTest (0 ms total)

    [----------] Global test environment tear-down
    [==========] 2 tests from 1 test case ran. (0 ms total)
    [ PASSED ] 2 tests.
    [100%] Built target runTests

        注意到,代码的前半部分输出是编译单元测试程序,后半部分输出则是单元测试结果。从结果可以看到我们运行了一个单元测试用例,该测试用例的两个小测试都成功通过。
        到这里展示的是一个简单demo,在接下来将展示实际开发过程中经常使用的事件机制。



    其他

        Gcov & Lcov是用于检查代码覆盖率的工具,貌似还可以与gtest结合使用。


    Reference

        [1] https://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/ HelloWorld的示例参考这里

  • 相关阅读:
    ensp实验:使用Serial接口
    1146
    Navicat连linux上mysql数据库报错can't connect to mysql server ... 10060
    Bug 23572982,Oracle19c新建pdb受限模式,SYNC PDB FAILED WITH ORA-959 DURING 'CREATE USER
    内核参数限制导致无法su切换登录用户
    模拟测试恢复redhat7.5系统权限
    Oracle-OGG,双向同步过滤OGG自身用户的DML失效,如何处理?
    OGG-Oracle同步Sequence
    Scalable Sequences 学习测试
    OGG-DDL同步报错OGG-00516 ORA-12991: column is referenced in a multi-column constraint]
  • 原文地址:https://www.cnblogs.com/bluepcghost/p/unit_test_gtest.html
Copyright © 2011-2022 走看看