Google Test separates Projekt - So führen Sie Tests für das C ++ - Projekt durch

Ich versuche herauszufinden, wie Google Test mit CMake für mein C ++ - Projekt ausgeführt wird. Bisher habe ich ein Projekt namens Simple und ein Google Test-Projekt namens SimpleTest erstellt.

ür das einfache Proje

Hier ist meine CMakeLists.txt-Datei:

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})

Hier ist meine main.cpp-Datei:

#include <iostream>

#include "NewCppClass.h"

using namespace std;

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

Hier ist meine Klassenüberschrift:

#ifndef SIMPLE_NEWCPPCLASS_H
#define SIMPLE_NEWCPPCLASS_H

class NewCppClass {
    public:
        int getNumberToTest();

};

#endif //SIMPLE_NEWCPPCLASS_H

Hier ist meine CPP-Datei:

#include "NewCppClass.h"

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

ür das SimpleTest-Proje

Hier ist meine CMakeLists.txt-Datei:

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})

Hier ist meine Main_TestAll.cpp-Datei:

#include "gtest/gtest.h"

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

Hier ist die MyFirstTest.cpp-Datei:

Natürlich muss sich dies ändern, wenn ich herausfinde, wie ich auf mein einfaches Projekt verweisen kann.

#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

AKTUALISIEREN

πάντα-ῥεῥ hat das geschriebenFrag:

Ich würde empfehlen, alle Testfallklassen (als reine .cpp-Quellen) in ein separates Projekt zu stellen und mit den zu testenden Klassen aus einem separaten Bibliotheksprojekt zu verknüpfen. Schließen Sie gtest_all.cc in die main () - Funktion ein oder verknüpfen Sie die gtest-Bibliothek mit dem Testprojekt.

Um die Testfälle auszuführen, fügen Sie das Ausführen des UnitTester-Artefakt-Builds aus diesem Projekt als zusätzlichen Build-Schritt hinzu.

Ich denke, das ist die richtige Richtung, also füge ich sie der Frage hinzu, um mich selbst daran zu erinnern, und sie kann für andere hilfreich sein.

Auch unten, geschrieben von πάντα-ῥεῥ:

... die getesteten Klassen sollten in einem separaten Bibliotheksartefakt gebündelt und mit der Test-Runner-Anwendung verknüpft werden.

Ich füge all diese Informationen hier ein, während ich versuche, in meinem Kopf zu kompilieren, was getan werden muss.

Wenn ich verstehe, was richtig gemacht werden muss, muss ich (in meinem C ++ - Projekt) der CMakeLists.txt-Datei hinzufügen, um GTest als ExternalProject hinzuzufügen und die Tests in add_executable hinzuzufügen. Etwas wie das

################################
# 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 )

Antworten auf die Frage(2)

Ihre Antwort auf die Frage