Отдельный проект 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 )