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 )