第一个项目与cmake和谷歌测试(gtest)



我正在训练第一次使用cmake和gtest。我写了一个测试。但是这个测试没有运行。我已经看过文件了https://cmake.org/cmake/help/latest/module/GoogleTest.html

我的项目中的文件:CMakeLists.txt func1.h func.cpp main.cpp mTest.cpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)
project(t1 VERSION 0.1.0)
enable_testing()
find_package(GTest REQUIRED)
add_executable(t1 main.cpp)
add_library(func STATIC func.cpp)
add_library(mTest STATIC mTest.cpp) 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
target_link_libraries(t1 func mTest gtest  gtest_main pthread)
gtest_discover_tests(t1)

main.cpp:

#include <iostream>
#include "func1.h"
#include "gtest/gtest.h"

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

mTest.cpp:

#include <vector>
#include "func1.h"
#include "gtest/gtest.h"
TEST(prime_mumbers, calc_n_prime_numbers_test) 
{
std::vector<size_t> prime_numbers = 
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 57, 53, 59, 61, 67, 71, 73};
size_t n = prime_numbers.size();
std::vector<size_t> res(n);
calc_n_prime_numbers(n, res.data());
EXPECT_EQ(prime_numbers,res);
}

结果:

[==========] Running 0 tests from 0 test suites.
[==========] 0 tests from 0 test suites ran. (0 ms total)
[  PASSED  ] 0 tests.
[1] + Done                       "/usr/bin/gdb" --interpreter=mi --tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-9jep64np.x0l" 1>"/tmp/Microsoft-MIEngine-Out-qcr0fwol.v1o"

链接器可能会将您的测试排除在外,因为您在主文件中没有使用静态库中的任何符号进行测试。解决方案是强制链接整个库。

cmake_minimum_required(VERSION 3.0.0)
project(t1 VERSION 0.1.0)
enable_testing()
find_package(GTest REQUIRED)
add_executable(t1 main.cpp)
add_library(func STATIC func.cpp)
add_library(mTest STATIC mTest.cpp) 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
target_link_options(t1 --whole-archive) # <--
target_link_libraries(t1 func mTest gtest  gtest_main pthread)
gtest_discover_tests(t1)

如果您不想强制其他库使用整个库,您可以只对"mTest"库执行此操作。

cmake_minimum_required(VERSION 3.0.0)
project(t1 VERSION 0.1.0)
enable_testing()
find_package(GTest REQUIRED)
add_executable(t1 main.cpp)
add_library(func STATIC func.cpp)
add_library(mTest STATIC mTest.cpp) 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
target_link_libraries(t1 func -Wl,--whole-archive mtest -Wl,--no-whole-archive gtest gtest_main pthread)
#                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
gtest_discover_tests(t1)

@S。M.正确地发现了这个问题:链接器正在丢弃初始化用于注册测试的全局(例如,查看Bartłomiej Filipek的博客,了解测试的自注册是如何在后台工作的(。

然而,有几种更好的方法可以解决这个问题,而不是篡改链接器标志(这是特定于平台的(。

如果你的主函数没有做任何特别的事情(你的当前没有(,那么你可以去掉定义main的源文件,使mTest成为可执行文件,并链接到gtest_main而不是

cmake_minimum_required(VERSION 3.0.0)
project(t1 VERSION 0.1.0)
enable_testing()
find_package(GTest REQUIRED)
add_library(func STATIC func.cpp)
add_executable(mTest mTest.cpp) 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
find_package(Threads REQUIRED)
target_link_libraries(mTest PRIVATE func gest_main Threads::Threads)
gtest_discover_tests(t1)

如果您的主函数确实做了一些不同的事情,典型的方法是将main放入其自己的静态库中,并将其链接到测试可执行文件中,而不是gtest_main:

cmake_minimum_required(VERSION 3.0.0)
project(t1 VERSION 0.1.0)
enable_testing()
find_package(GTest REQUIRED)
add_library(func STATIC func.cpp)
add_library(test_main STATIC main.cpp)
target_link_libraries(test_main PRIVATE gtest)
add_executable(mTest mTest.cpp) 
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
find_package(Threads REQUIRED)
target_link_libraries(mTest PRIVATE func test_main gtest Threads::Threads)
gtest_discover_tests(t1)

最新更新