4

CMake を使用して C++ プロジェクトに対して Google Test を実行する方法を見つけようとしています。ここまでで、Simple というプロジェクトと SimpleTest という Google Test プロジェクトを作成しました。

単純なプロジェクトの場合

ここに私の CMakeLists.txt ファイルがあります:

cmake_minimum_required(VERSION 2.8.4)
project(Simple)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    main.cpp
    NewCppClass.cpp
    NewCppClass.h)

add_executable(Simple ${SOURCE_FILES})

ここに私の main.cpp ファイルがあります:

#include <iostream>

#include "NewCppClass.h"

using namespace std;

int main() {
    NewCppClass newCppClass;
    int i = newCppClass.getNumberToTest();
    cout << "i = " << i;
    return 0;
}

これが私のクラスヘッダーです:

#ifndef SIMPLE_NEWCPPCLASS_H
#define SIMPLE_NEWCPPCLASS_H

class NewCppClass {
    public:
        int getNumberToTest();

};

#endif //SIMPLE_NEWCPPCLASS_H

ここに私の.cppファイルがあります:

#include "NewCppClass.h"

int NewCppClass::getNumberToTest() {
    return 5;
}

SimpleTest プロジェクトの場合

ここに私の CMakeLists.txt ファイルがあります:

cmake_minimum_required(VERSION 2.8.4)
project(SimpleTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    Main_TestAll.cpp
    MyFirstTest.cpp)

enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(SimpleTest ${SOURCE_FILES})

target_link_libraries(SimpleTest ${GTEST_BOTH_LIBRARIES})

ここに私の Main_TestAll.cpp ファイルがあります:

#include "gtest/gtest.h"

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

MyFirstTest.cpp ファイルは次のとおりです。

もちろん、Simple プロジェクトを指す方法を理解したら、このインクルードを変​​更する必要があります。

#include "this/package/NewCppClass.h"
#include "gtest/gtest.h"

namespace {

// The fixture for testing class NewCppClass.
    class NewCppClassTest : public ::testing::Test {
    protected:
        // You can remove any or all of the following functions if its body
        // is empty.

        NewCppClassTest() {
            // You can do set-up work for each test here.
        }

        virtual ~NewCppClassTest() {
            // You can do clean-up work that doesn't throw exceptions here.
        }

        // If the constructor and destructor are not enough for setting up
        // and cleaning up each test, you can define the following methods:

        virtual void SetUp() {
            // Code here will be called immediately after the constructor (right
            // before each test).
        }

        virtual void TearDown() {
            // Code here will be called immediately after each test (right
            // before the destructor).
        }

        // Objects declared here can be used by all tests in the test case for Foo.
    };

// Tests that NewCppClass::getNumberToTest() is not equal to this fixed mumber.
    TEST_F(NewCppClassTest, ThisTestShallFail) {
        NewCppClass newCppClass;
        int i = newCppClass.getNumberToTest();
        EXPECT_EQ(i, 2);
    }

}  // namespace

アップデート:


πάντα-ῥεῖ がこの質問を書きました:

すべてのテスト ケース クラスを (プレーンな .cpp ソースとして) 別のプロジェクトに配置し、別のライブラリ プロジェクトからテスト対象のクラスにリンクすることをお勧めします。main() 関数で gtest_all.cc をインクルードするか、テスト プロジェクトで gtest ライブラリにリンクします。

テスト ケースを実行するには、追加のビルド ステップとして、そのプロジェクトからの UnitTester アーティファクト ビルドの実行を追加します。

これは正しい方向だと思うので、自分自身へのリマインダーとして質問に追加しています。他の人にも役立つかもしれません。

また、以下は、πάντα-ῥεῖ によって書かれています。

...テスト対象のクラスは、別のライブラリ アーティファクトにバンドルされ、テスト ランナー アプリケーションにリンクされる必要があります。

何をする必要があるかを頭の中でまとめようとして、ここにすべての情報を含めます。


何を正しく行う必要があるかを理解したら、(私の C++ プロジェクトで) CMakeLists.txt ファイルに追加して、GTest を ExternalProject として追加し、add_executable にテストを追加する必要があります。このようなもの:

################################
# GTest
################################
include(ExternalProject)
enable_testing()
find_package(GTest REQUIRED)

################################
# Unit Tests
################################
# Add test cpp file
# Link test executable against gtest & gtest_main
add_executable(SimpleTest
    Main_TestAll.cpp
    MyFirstTest.cpp)
target_link_libraries(Test GTest)
add_test( runUnitTests runUnitTests )
4

1 に答える 1

5

問題は、コード モジュールの構成にあるようです。最終出力として実行可能プログラムを提供する c++ ターゲット プロジェクトがあるとします。

  • 2 つの実行可能なアーティファクトを作成したいとします。
    • 最終申請書
    • 指定したすべてのテスト ケースを実行するテスト ランナー アプリケーション
  • これについては、このシナリオを適切にセットアップする方法について、あなたの誤解であるべきです。
    関数を実行可能なアーティファクト (アプリケーション) から別のもの (テスト ランナー) にリンクすることはできません。
  • 次のいずれかを実行できます
    • コア クラスをライブラリに分けて提供し、それを最終的なアプリケーションとテスト ランナーにリンクします。main()アプリケーションは、エントリ ポイントからシン ラッパーを提供する必要があります。
    • テスト対象のクラスのソースへのリンクを追加し、テスト ランナー環境でそれらを完全にコンパイルします。
于 2015-05-05T19:54:25.557 に答える