C ++プロジェクトはCMakeとGoogleTestを使用します(ばかげたチュートリアル)

このガイドでは、CMakeを使用して新しいC ++プロジェクトを設定する方法と、Googleのテストフレームワークを介した単体テストについて説明します。この設定を使用すると、テスト駆動開発にC ++をすぐに使用できるようになります。また、既存のプロジェクトにgtestを追加して、古い(既存の)コードベースでTDDを開始する方法を理解するのも簡単です。

環境:win10サブシステムlinux ubuntu18.04

cmake(3.10以降)、g ++、gcc、およびその他の基本的な環境がインストールされていることを確認してください。

最終的なレンダリング:

githubからGoogleテストのソースコードのクローンを作成します

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}

複製されたgooletestフォルダーをプロジェクトのlibフォルダーに配置します。

個人の単純なプロジェクトのほとんどが上記のディレクトリ構造を使用することは問題ないはずなので、これはあなたの将来や他の初心者の参照用のテンプレートに相当します。もちろん、CMakeを学び、好きなことをするのが最善の方法です。CMakeはそれを理解するのに時間がかかる場合があります。このテンプレートは、時間に追われている人に適しています。

CMakeLists.txt

ターゲットを生成する方法は2つあります。1つはファイル名を1つずつリストすることです。これの利点は、不要なファイルをコンパイルする必要がないことです。

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

もう1つは、すべてのファイルをコンパイルしてから実行可能ファイルを生成することです。これの利点は、ファイルを追加した後に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})

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

# 2
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ディレクトリ内のすべてのテストファイルのすべてのテストケースを実行します。ここに追加されるのは1つだけです。

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

googletestの別のプロジェクトであるgmockも生成されます。生成したくない場合は、次のコマンドを使用して必要なものを生成することもできます。

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
  6
[  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はまだ理解していませんでした。この種の愚かさしか理解できません。チュートリアルはハハです。上記のブログに誤りや脱落がある場合は、プライベートメッセージを送信するか、元のテキストを直接表示してください。そのブログによると、自分で試してみました。

 

おすすめ

転載: blog.csdn.net/Fei20140908/article/details/104344462