Отдельный проект Google Test - Как запустить тесты на проекте C ++

Я пытаюсь понять, как запустить Google Test для моего C ++ проекта с использованием CMake. До сих пор я создал проект под названием Simple и проект Google Test под названием SimpleTest.

Для простого проекта

Вот мой файл 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:

Конечно, это включение должно измениться, когда я пойму, как указать на мой простой проект.

#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) в отдельный проект и связать их с тестируемыми классами из отдельного библиотечного проекта. Включите gtest_all.cc с функцией main () или ссылку на библиотеку 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 )

Ответы на вопрос(1)

Ваш ответ на вопрос