zoukankan      html  css  js  c++  java
  • googletest进行单元测试(使用cmake编译)

    一、前提:

    1、假定你的系统为centos6系列

    2、假定你已经安装了基本的编译环境,gcc,g++4.4.7

    3、假定你已经设置了环境变量:KDS_MOBILE_STOCK_HOME

    4、假定你已经安装了unzip解压缩软件,若未安装,请安装之:yum install zip unzip

    5、假定你已经安装了vim,若未安装可用vi代替vim命令

    二、安装cmake

    1、下载源码:http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz

    2、解压源码目录:tar –xzvf cmake-2.8.12.tar.gz

    3、进入cmake-2.8.12目录:cd cmake-2.8.12

    4、编译:

    ./bootstrap

    gmake

    gmake install

    三、安装googletest

    1、下载源码:https://codeload.github.com/google/googletest/zip/release-1.8.0

    2、解压源码:unzip googletest-release-1.8.0.zip

    3、进入源码目录:cd googletest-release-1.8.0

    4、创建并进入目录build:mkdir build && cd build

    5、编译:cmake .. && make

    6、将静态库拷贝至指定lib目录:

    cp googlemock/gtest/libgtest.a $KDS_MOBILE_STOCK_HOME/3rd-soft/lib/

    cp googlemock/gtest/libgtest_main.a $KDS_MOBILE_STOCK_HOME/3rd-soft/lib/

    7、将头文件拷贝至指定include目录:

    cp -ri ../googletest/ $KDS_MOBILE_STOCK_HOME/3rd-soft/include/
    
    mv $KDS_MOBILE_STOCK_HOME/3rd-soft/include/googletest $KDS_MOBILE_STOCK_HOME/3rd-soft/include/googletest1.8.0

    四、建立演示工程

    建立工程目录:mkdir gtest_demo && cd gtest_demo

    写最外层CMakeLists.txt:vim CMakeLists.txt

    # 工程名
    set (PROJECT_NAME my-gtest)
    PROJECT(${PROJECT_NAME})
    SET(CMAKE_C_COMPILER "g++")  #选择编译器,默认是gcc
    
    message("工程名: " ${PROJECT_NAME})
    message("工程目录: " ${PROJECT_SOURCE_DIR})
    message("KDS_MOBILE_STOCK_HOME目录: " $ENV{KDS_MOBILE_STOCK_HOME})
    
    # 最低版本需求
    cmake_minimum_required(VERSION 2.8)
    
    set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
    set (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    
    message("编译后可执行程序目录: " ${EXECUTABLE_OUTPUT_PATH})
    message("编译后库程序文件目录: " ${LIBRARY_OUTPUT_PATH})
    
    ADD_SUBDIRECTORY(src)
    # ADD_SUBDIRECTORY(gtest) # 此处先注释,原因是一开始没有测试工程

    一)、写源代码工程

    1、建立并进入源代码目录:mkdir src && cd src

    2、完成源代码文件编写:

    测试文件我们写两个功能,一个为计算模块calc,实现Add功能,一个为字符串模块string_util,实现将字符串转为数字功能

    1)、写calc模块头文件:vim calc.h

    # ifndef __KDS_CAlC_H_
    # define __KDS_CALC_H_
    class Calc
    {
    public:
        static int Add(int a, int b);
    };
    # endif

    2)、写calc模块实现文件:vim calc.cpp

    # include "calc.h"
    int Calc::Add(int a, int b)
    {
        return a+b;
    }

    3)、写string工具模块头文件:vim string_util.h

    # ifndef __KDS_STRING_UTIL_H_
    # define __KDS_STRING_UTIL_H_
    class StringUtil
    {
    public:
        static int ToInt(const char* str);
    };
    # endif

    4)、写string工具模块实现文件:vim string_util.cpp

    # include "stdlib.h"
    # include "string_util.h"
    int StringUtil::ToInt(const char * str)
    {
        return atol(str);
    }

    5)、写main函数:vim main.cpp

    # include <iostream>
    # include "calc.h"
    # include "string_util.h"
    int main()
    {
        std::cout<<"3+5="<<Calc::Add(3, 5)<<std::endl;
        std::cout<<"ToInt(345)="<<StringUtil::ToInt("345")<<std::endl;
        return 0;
    }

    最后我们需要将这5个文件编译

    3、写编译文件:vim CMakeLists.txt

    # 打印当前目录
    message("源程序工程当前目录: "  ${CMAKE_CURRENT_SOURCE_DIR})
    
    # 头文件目录
    INCLUDE_DIRECTORIES(
        $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/include
        /usr/local/include/
        /usr/include
    )
    
    AUX_SOURCE_DIRECTORY(. DIR_SRCS)
    add_library(src ${DIR_SRCS})
    
    add_executable(src_sult ${DIR_SRCS})

    至此,源文件已经写完。

    4、验证:

    1)、返回上一层目录,建立并进入一个临时的build目录:cd ../ && mkdir build && cd build

    2)、编译:cmake .. && make

    此时可以看到当前目录下已经编译好了src_sult文件,运行之

    3)、运行:./src_sult

    截图如下:

    image

    二)、写测试工程

    1、退出src目录:cd ..

    2、建立并进入gtest测试工程目录:mkdir gtest && cd gtest

    3、写测试calc代码:vim test_calc.cpp

    # include <gtest/gtest.h>
    # include "src/calc.h"
    using namespace std;
    
    TEST(Test_Calc, Add)
    {
        EXPECT_TRUE(Calc::Add(3,5)==8);
    }

    4、写测试string_util代码:vim test_string_util.cpp

    # include <gtest/gtest.h>
    # include "src/string_util.h"
    using namespace std;
    
    TEST(Test_StringUtil, ToInt)
    {
        EXPECT_TRUE(StringUtil::ToInt("345")==345);
    }

    5、最后写CMakeLists.txt文件:vim CMakeLists.txt

    # 打印当前目录
    message("测试工程当前目录: "  ${CMAKE_CURRENT_SOURCE_DIR})
    
    # 需包含的头文件
    INCLUDE_DIRECTORIES(
        ${PROJECT_SOURCE_DIR}
        $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/include/googletest1.8.0/include
        /usr/local/include
        /usr/include
    )
    
    # 需包含的库文件
    link_directories(
        ${PROJECT_BINARY_DIR}/lib
        $ENV{KDS_MOBILE_STOCK_HOME}/3rd-soft/lib
        /usr/local/lib
        /usr/lib
    )
    
    find_package(Threads)
    
    AUX_SOURCE_DIRECTORY(. DIR_SRC_TESTS)
    add_executable(test_sult ${DIR_SRC_TESTS})
    TARGET_LINK_LIBRARIES(test_sult uuid gtest gtest_main libsrc.a)
    
    TARGET_LINK_LIBRARIES(test_sult ${CMAKE_THREAD_LIBS_INIT})

    三、改写最外层CMakeLists.txt文件

    1、回到上一层目录:cd ..

    记得前面最初的CMakeLists.txt中最后一行ADD_SUBDIRECTORY(gtest)被注释了,把那个#去掉

    image

    2、改写后最终的CMakeLists.txt文件:vim CMakeLists.txt

    # 工程名
    set (PROJECT_NAME my-gtest)
    PROJECT(${PROJECT_NAME})
    SET(CMAKE_C_COMPILER "g++")  #选择编译器,默认是gcc
    
    message("工程名: " ${PROJECT_NAME})
    message("工程目录: " ${PROJECT_SOURCE_DIR})
    message("KDS_MOBILE_STOCK_HOME目录: " $ENV{KDS_MOBILE_STOCK_HOME})
    
    # 最低版本需求
    cmake_minimum_required(VERSION 2.8)
    
    set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
    set (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    
    message("编译后可执行程序目录: " ${EXECUTABLE_OUTPUT_PATH})
    message("编译后库程序文件目录: " ${LIBRARY_OUTPUT_PATH})
    
    ADD_SUBDIRECTORY(src)
    ADD_SUBDIRECTORY(gtest)

    四)运行测试

    1、进入build目录:cd build

    2、编译:cmake .. && make

    此时看到当前目录下已经生成了test_sult测试文件了

    3、查看:ls

    image

    4、运行之:./test_sult

    如下图所示:

    image

  • 相关阅读:
    周末小练习
    第十二届全国大学生信息安全竞赛总结与反思
    sql注入学习心得与sqlmap使用心得
    2019“嘉韦思”杯RSA256题目wp
    斐波那契数列求解的三种方法
    二叉树的下一个节点
    替换空格
    二维数组中的查找
    不修改数组找出重复数字
    数组中重复数字
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/6378495.html
Copyright © 2011-2022 走看看