本指南将向您展示如何通过Google的测试框架使用CMake和单元测试来设置新的C ++项目。 通过此设置,您可以立即开始使用C ++进行测试驱动的开发。 弄清楚如何将gtest添加到现有项目并开始在旧的(现有)代码库上进行TDD也很简单。

环境:win10 子系统linux ubuntu18.04

确保已经安装了cmake(3.10以上),g++,gcc等基本环境。

最后的效果图:

从github上将 google test 源码clone下来

git clone https://github.com/google/googletest/

gtest 项目里面包含了CMakeLists.txt,所以集成到自己的项目里面是比较简单的(如果你懂cmake的话,如果不懂的话就按照本指南做吧。

IndexProject
├── CMakeLists.txt
├── build
├── lib
│   └── googletest
├── src
│   ├── CMakeLists.txt
│   ├── Formula.cpp
│   ├── Formula.h
│   └── main.cpp
└── tst
    ├── CMakeLists.txt
    ├── Formula-test.cpp
    └── main.cpp

下面这个命令是创建这个目录结构

mkdir -p IndexProject/{build,lib,src,tst}

将clone下来的gooletest 文件夹放到项目的lib文件夹下。

大部分的个人的简单项目用以上目录结构应该都没问题,所以这个相当于一个模板吧,供自己以后以及其它菜鸟参考。最好的方式当然是学习CMake,然后自己随心所欲想怎么搞怎么搞,可以CMake想搞明白还挺花时间的,对于时间紧迫的人这个模板是个不错的选择。

CMakeLists.txt

生成target有两种方式,一种直接将文件名一个个列出来,这样的好处是不需要编译不必要的文件。

add_executable(ExampleProject main.cpp file1.cpp file1.h)

还有一种是将所有的文件全编译然后生成执行文件,这样的好处是添加文件后不需要修改CMakeLists.txt就可以直接运行。

file(GLOB_RECURSE SOURCES LIST_DIRECTORIES true *.h *.cpp)

根目录下的CMakeLists.txt

# cmake version
cmake_minimum_required(VERSION 3.10)
# project name
project(IndexProject)
#采用c++14标准
set(CMAKE_CXX_STANDARD 14)
include_directories(src)
add_subdirectory(src)
add_subdirectory(tst)
add_subdirectory(lib/googletest)

这里的include_directories(src)是为了让src下的头文件全局可见。

src 目录下的CMakeLists.txt

#设置 BINARY 为项目名IndexProject
set(BINARY ${CMAKE_PROJECT_NAME})
# add_executable(ExampleProject main.cpp file1.cpp file1.h)
file(GLOB_RECURSE SOURCES LIST_DIRECTORIES true *.h *.cpp)
set(SOURCES ${SOURCES})
add_executable(${BINARY}_run ${SOURCES})
# 为了让单元测试的时候src下的代码能被作为静态链接库使用
add_library(${BINARY}_lib STATIC ${SOURCES})

tst 目录下的CMakeLists.txt

set(BINARY ${CMAKE_PROJECT_NAME}_tst)
file(GLOB_RECURSE TEST_SOURCES LIST_DIRECTORIES false *.h *.cpp)
set(SOURCES ${TEST_SOURCES})
add_executable(${BINARY} ${TEST_SOURCES})
add_test(NAME ${BINARY} COMMAND ${BINARY})
# 链接src生成的lib库和gtest库
target_link_libraries(${BINARY} PUBLIC ${CMAKE_PROJECT_NAME}_lib gtest)

添加源代码

src/main.cpp :

#include <iostream>
#include "Formula.h"
int main() {
    std::cout << "Bla: " << Formula::bla(2) << std::endl;
    return 0;

src/Formula.h

#ifndef EXAMPLEPROJECT_FORMULA_H
#define EXAMPLEPROJECT_FORMULA_H
class Formula {
public:
    static int bla(int arg1);
#endif //EXAMPLEPROJECT_FORMULA_H

src/Formula.cpp:

#include "Formula.h"
int Formula::bla(int arg1) {
    return arg1 * 2;

添加测试代码

tst/main.cpp

#include "gtest/gtest.h"
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();

上面那个文件会执行所有tst目录下的测试文件的所有测试用例,这里只添加一个。

tst/Formula-test.cpp

#include "gtest/gtest.h"
#include "Formula.h"
TEST(blaTest, test1) {
    //arrange
    //act
    //assert
    EXPECT_EQ (Formula::bla (0),  0); //通过
    EXPECT_EQ (Formula::bla (2), 4); //通过
    EXPECT_EQ (Formula::bla (4), 6); //不通过
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: /usr/bin/python3.6 (found version "3.6.9")
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /d/code/IndexProject/build

然后使用 make 编译生成我们需要的东西,可以使用

make all

生成所有的。

Scanning dependencies of target IndexProject_lib
[  5%] Building CXX object src/CMakeFiles/IndexProject_lib.dir/Formula.cpp.o
[ 11%] Building CXX object src/CMakeFiles/IndexProject_lib.dir/main.cpp.o
[ 17%] Linking CXX static library libIndexProject_lib.a
[ 17%] Built target IndexProject_lib
Scanning dependencies of target IndexProject_run
[ 23%] Building CXX object src/CMakeFiles/IndexProject_run.dir/Formula.cpp.o
[ 29%] Building CXX object src/CMakeFiles/IndexProject_run.dir/main.cpp.o
[ 35%] Linking CXX executable IndexProject_run
[ 35%] Built target IndexProject_run
Scanning dependencies of target gtest
[ 41%] Building CXX object lib/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 47%] Linking CXX static library ../../libgtestd.a
[ 47%] Built target gtest
Scanning dependencies of target IndexProject_tst
[ 52%] Building CXX object tst/CMakeFiles/IndexProject_tst.dir/Formula-test.cpp.o
[ 58%] Building CXX object tst/CMakeFiles/IndexProject_tst.dir/main.cpp.o
[ 64%] Linking CXX executable IndexProject_tst
[ 64%] Built target IndexProject_tst
Scanning dependencies of target gmock
[ 70%] Building CXX object lib/googletest/googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.o
[ 76%] Linking CXX static library ../../libgmockd.a
[ 76%] Built target gmock
Scanning dependencies of target gmock_main
[ 82%] Building CXX object lib/googletest/googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.o
[ 88%] Linking CXX static library ../../libgmock_maind.a
[ 88%] Built target gmock_main
Scanning dependencies of target gtest_main
[ 94%] Building CXX object lib/googletest/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
[100%] Linking CXX static library ../../libgtest_maind.a
[100%] Built target gtest_main

这里还生成了gmock,这是googletest下面的另一个项目,如果不想生成它们,也可以使用以下命令生成我们想要的:

make IndexProject_tst;make IndexProject_run
[ 12%] Building CXX object src/CMakeFiles/IndexProject_lib.dir/Formula.cpp.o
[ 25%] Building CXX object src/CMakeFiles/IndexProject_lib.dir/main.cpp.o
[ 37%] Linking CXX static library libIndexProject_lib.a
[ 37%] Built target IndexProject_lib
[ 50%] Building CXX object lib/googletest/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
[ 62%] Linking CXX static library ../../libgtestd.a
[ 62%] Built target gtest
[ 75%] Building CXX object tst/CMakeFiles/IndexProject_tst.dir/Formula-test.cpp.o
[ 87%] Building CXX object tst/CMakeFiles/IndexProject_tst.dir/main.cpp.o
[100%] Linking CXX executable IndexProject_tst
[100%] Built target IndexProject_tst
[ 33%] Building CXX object src/CMakeFiles/IndexProject_run.dir/Formula.cpp.o
[ 66%] Building CXX object src/CMakeFiles/IndexProject_run.dir/main.cpp.o
[100%] Linking CXX executable IndexProject_run
[100%] Built target IndexProject_run

找到我们生成的可执行文件

$ find . -executable -type f -name "IndexProject*"
./src/IndexProject_run
./tst/IndexProject_tst
$ ./src/IndexProject_run;./tst/IndexProject_tst
Bla: 4
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from blaTest
[ RUN      ] blaTest.test1
/d/code/IndexProject/tst/Formula-test.cpp:9: Failure
Expected equality of these values:
  Formula::bla(4)
    Which is: 8
[  FAILED  ] blaTest.test1 (1 ms)
[----------] 1 test from blaTest (2 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (3 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] blaTest.test1
 1 FAILED TEST

这篇指南主要参考一个国外的博客,如果想看原版内容,点击这里,找了好久才找到能看懂的博客,cmake看了大半天还是没太搞明白,只能看懂这种傻瓜式的教程了哈哈。以上博客如果记载有错漏之处请私信或者直接查看原文。本人也只是按照那个博客自己试了一遍。

本指南将向您展示如何通过Google的测试框架使用CMake和单元测试来设置新的C ++项目。 通过此设置,您可以立即开始使用C ++进行测试驱动的开发。 弄清楚如何将gtest添加到现有项目并开始在旧的(现有)代码库上进行TDD也很简单。环境:win10 子系统linux ubuntu18.04确保已经安装了cmake(3.10以上),g++,gcc等基本环境。最后的效果图:...
有关如何使用CMake设置googletest的示例项目。 详细的博客可以在这里找到 ├── build # build folder for this project ├── src │ ├── sample_lib_1 # Sample Library 1 folder │ │ ├── sample_lib_1.cpp # Implementation file for Sample Library 1 │ │ ├── sample_lib_1.hpp # Declarition file for Sample Library 1 │ │ ├── CMakeList.txt # CMake definition file for Sampl
cmake也一样,如有需要新的版本自行安装。 2)vscode安装插件 必要的插件c/c++ 0.28.1 cmake 0.0.17 cmake tools 1.4  (这几个插件的版本可能会不同,以扩展搜索到的最新的为准) 二、创建项目实验 1)打开项目文件夹 第一步:打开vscode,点击左上角文件,在下拉菜单选择打开文件夹!注意,是打开文件夹,不是工作区,也不是其它的!! 第二步:随便选择一个空的文件夹点击ok即可,选择后会出现工程目录如下图 2)配置环境
CMake 示例 这个存储库是最初为 XCode 项目生成创建的 CMake 项目结构示例。 但它包含了如何构建代码的宝贵见解,使用 CMake 可以轻松维护这些代码。 项目结构 项目结构基本上是一个带有两个静态库的主项目。 洞察力是 Foo 是您正在从事并作为产品交付的某种项目。 这个 Foo 产品依赖于两个静态库 A 和 B,它们是没有外部依赖的独立库。 ├── CMakeLists.txt ├── README.md ├── include ├── libs │   ├── A │   │   ├── CMakeLists.txt │   │   ├── include │   │   │   └── A │   │   │   └── A.h │   │   ├── src │   │   │   └── A.cpp │   │ 
C/C++从零开始的CMake教程 如果你有过在linux系统上源码安装某款软件的经历,那么肯定对这三部曲一点都不会陌生——配置(configure)、编译(make)、安装(make install)。几乎每次都是机器人般的操作,这背后其实是make(准确地说应该是GNU Make)在默默为你干了不少活。 1.编译hello.c——单一源文件的编译 //hello.c #include int main(){ puts("hello, world!"); return 0; 为了编译生成对应的可执行文件,你可能会使用下面的命令: $ cc -o hello h
这段时间看了些cmake构建的一些规则,正巧项目中需要用到单元测试,这里就用cmake构建googletest框架(单元测试)来进行测试。正好也复习一下cmake构建规则。这里进行cmake构建的时候采用的是引入本地第三方库的方式进行构建,一般常规构建大都采用将第三方库源文件fetch到本地项目的third_party目录下进行整体项目的引入构建。我这里采用先将第三方源码编译安装后,引入到本地需要的项目中去的方式构建。首先,这里先下载googletest的源代码,这里采用的是1.10.0版本: ......
第一行where is the source code输入的是源码所在的路径。 第二行Where to build the binaries输入的是由CMake生成的项目工程。 然后按下Configure键,等待一会儿后会出现图示的界面,勾选箭头所指的两... 4. 包含其它.h和.cpp文件 1. CMake简介 本教程面向Linux系统,重点讲解CMake的基本使用方法,用于构建C++项目。采用的平台为Jetson Nano嵌入式开发板,arm64系统。当然,本教程同样适合绝大部分Linux平台。在讲解CMake使用方法之前,先要了解gcc、make和MakeFile的概念。 gcc(GNU Compiler Collection)即为GNU编译器套件,也可以简单认为是编译器,它可以编译很多种编程语言,包括C、C++、Objective-C、Fortran、Java等。 enable_language(Fortran) set(CMAKE_Fortran_STANDARD 90) set(CMAKE_Fortran_STANDARD_REQUIRED ON) # 添加 C++ 与 Fortran 源文件 add_executable(MyExecutable main.cpp myfunction.f90) 在这个示例中,我们将 C++ 和 Fortran 文件都添加到了同一个可执行文件中,以确保 C++ 与 Fortran 代码之间可以相互调用。如果需要更复杂的混合编译方案,可以使用 CMake 的 `add_library` 命令将 C++ 与 Fortran 代码分别编译成静态或动态库,再进行链接。