【问题标题】:Google Test separate project - How to get tests running against the C++ projectGoogle 测试单独项目 - 如何针对 C++ 项目运行测试
【发布时间】:2015-07-14 12:20:45
【问题描述】:

我想弄清楚如何使用 CMake 对我的 C++ 项目运行 Google 测试。到目前为止,我已经创建了一个名为 Simple 的项目和一个名为 SimpleTest 的 Google 测试项目。

对于简单的项目

这是我的 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

更新:


πάντα-ῥεῖ 写了这个question

我建议将所有测试用例类(作为普通的 .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 )

【问题讨论】:

  • 这里有一些简明的信息恕我直言:*.com/questions/8507723/… 正如我之前的回答中提到的,被测试的类应该捆绑到一个单独的库工件中,并链接到 testrunner 应用程序。
  • @πάνταῥεῖ - 我想我明白了。请记住,我是 C++ 和 CMake 以及 GoogleTest 的新手。有很多信息比帮助更令人困惑。所以请帮帮我。 “被测试的类应该被捆绑到一个单独的库工件中......”这意味着我的 C++ 项目,是吗? “捆绑到单独的库工件中”是什么意思? “......并链接到测试运行程序应用程序。”这意味着 C++ 项目的 CMakeLists.txt 必须包含一个包含 GTest 和单元测试的部分。我开始做对了吗?
  • “你所说的“捆绑到一个单独的库工件中”是什么意思?“”我的意思是你应该为你的核心类创建一个单独的库(静态或共享)拥有(所有正在测试的),然后将其链接到测试运行程序或您的真实(最终)应用程序目标。还有更多要点需要考虑: 1. 主机系统是否用于测试运行器是否与目标系统相同?2. 在这些被测类中是否有用户交互代码(GUI、终端)输入?
  • @πάνταῥεῖ - 对于 1 和 2 不!我只是想在我的 C++ 项目中测试一种方法。所以你的意思是我应该有一个链接到 GTest 和我的 C++ 项目的测试运行器?
  • @πάνταῥεῖ - 你的意思是我应该创建一个单独的库来存放我的类以及 C++ 项目吗?

标签: c++ cmake googletest clion


【解决方案1】:

问题似乎出在代码模块的组织上。假设你有一个 c++ 目标项目,它提供了一个可执行程序作为它的最终输出:

  • 我想你想创建两个可执行的工件
    • 您的最终申请
    • 运行您指定的所有测试用例的测试运行器应用程序
  • 至于这应该是您的误解,如何正确设置此场景:
    您不能将可执行工件(应用程序)中的函数链接到另一个工件(测试运行程序)。
  • 您可以
    • 在库中单独提供核心类并将其链接到您的最终应用程序和测试运行程序。应用程序应该从 main() 入口点提供一个瘦包装器。
    • 为被测类添加源链接,并在测试运行器环境中完全编译它们

【讨论】:

  • 嘿,πάντα ῥεῖ:我在 youtube 上找到了一个很棒的教程,用于使用 NetBeans 通过 Make 设置 GoogleTest。我对这两个项目的事情真的很困惑,博倩的教程说得一清二楚。 youtube.com/…