unit-testing - 如何开始使用 GTest 和 CMake

标签 unit-testing cmake googletest

我最近热衷于使用 CMake 来编译我的 C++ 项目,现在想开始为我的代码编写一些单元测试。我决定使用 Google 测试实用程序来帮助解决此问题,但需要一些入门帮助。

我一整天都在阅读各种指南和示例,包括 Primer ,一个introduction at IBM以及一些关于SO( herehere )的问题以及我丢失的其他来源。我意识到那里有很多东西,但不知何故我仍然遇到困难。

我目前正在尝试实现最基本的测试,以确认我已经正确编译/安装了 gtest 并且它不起作用。唯一的源文件(testgtest.cpp)几乎完全取自 this之前的回答:

#include <iostream>

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

我关联的 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 2.6)
project(basic_test)

# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})

# Add test cpp file
add_executable(runUnitTests
    testgtest.cpp
)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
    NAME runUnitTests
    COMMAND runUnitTests
)

请注意,我选择链接到 gtest_main,而不是在 cpp 文件末尾提供 main,因为我相信这将使我能够更轻松地将测试扩展到多个文件。

在构建生成的 .sln 文件(在 Visual C++ 2010 Express 中)时,不幸的是,我得到了一长串以下形式的错误

2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)

我认为这意味着我没有成功链接到 gtest 库。我已确保在链接调试库时,我尝试在 Debug模式下构建。

编辑

经过更多的挖掘,我认为我的问题与我正在构建 gtest 的库类型有关。使用 CMake 构建 gtest 时,如果未选中 BUILD_SHARED_LIBS,并且我将程序链接到这些 .lib 文件,则会出现上述错误。但是,如果选中 BUILD_SHARED_LIBS,那么我会生成一组 .lib 和 .dll 文件。现在,当链接到这些 .lib 文件时,程序会编译,但运行时会提示找不到 gtest.dll。

SHARED 和非 SHARED 库之间有什么区别,如果我选择不共享,为什么它不起作用?我的项目的 CMakeLists.txt 中是否缺少一个选项?

最佳答案

解决方案涉及将 gtest 源目录作为项目的子目录。如果它对任何人有帮助,我已经在下面包含了工作的 CMakeLists.txt。

cmake_minimum_required(VERSION 2.6)
project(basic_test)

################################
# GTest
################################
ADD_SUBDIRECTORY (gtest-1.6.0)
enable_testing()
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

################################
# Unit Tests
################################
# Add test cpp file
add_executable( runUnitTests testgtest.cpp )
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
add_test( runUnitTests runUnitTests )

关于unit-testing - 如何开始使用 GTest 和 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8507723/

相关文章:

ios - 使用 CMake 的 Xcode 部署信息和图标

c++ - 在没有服务器的情况下运行客户端应用程序以验证响应的不同方法有哪些?

c# - WHERE 语句在使用 It.IsAny 的单元测试中不起作用

python - 是否有与 `unittest.TestCase.fail()` 相反的方法来通过 Python 单元测试?

c++ - 无法在另一台使用 OS-X Leopard (10.5.8) 的 Mac 上运行在 OS-X Snow Leopard (10.6.7) 上编译的应用程序。返回 libstdc++.6.dylib 错误

c++ - 使用 googletest 有选择地执行单元测试

c++ - gtest 是否支持文件比较?

c# - 单元测试与任务一起永远运行

unit-testing - 如何在golang中为http请求编写单元测试?

c++ - 我如何使用 find_package 链接 CMakeList.txt 中的 Boost(不在 usr/include 中)