Google 使用 CLion 进行测试不是 运行 测试

Google Test with CLion isn't running tests

我正在尝试使用 google 测试和 CLion 对 运行 进行简单测试。我想我已经正确设置了 cmake,并且我能够 "run a test"。当我这样做时,它说没有找到测试。有任何想法吗? CMakeLists.txt

cmake_minimum_required(VERSION 3.7)

project(expirement)

find_package(Threads REQUIRED)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp getstring.cpp tests.cpp)
include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)

ExternalProject_Add(googletest
        SOURCE_DIR "/home/dcooke/googletest-master/googletest/"
        )
ExternalProject_Get_Property(googletest source_dir)
include_directories(${source_dir}/include)

add_executable(expirement main.cpp getstring.cpp tests.cpp)
add_dependencies(expirement googletest)



target_link_libraries(expirement
        /home/dcooke/BuildBinaries/lib/libgtest.a
        /home/dcooke/BuildBinaries/lib/libgtest_main.a
        )

target_link_libraries(expirement Threads::Threads)

enable_testing()

测试文件:

#include "getstring.h"
#include "gtest/gtest.h"

TEST(StringTest, CheckReturnValue) {
    ASSERT_EQ("asdfasf",GetTheString());
}

命令行和结果:

/home/user/Code/expirement/cmake-build-debug/expirement --gtest_filter=StringTest.*:StringTest/*.*:*/StringTest.*/*:*/StringTest/*.* --gtest_color=no
Testing started at 10:18 AM ...
The String

Process finished with exit code 0
Empty test suite.

您可能需要使用 add_test() 将您的测试实际添加到测试目标

其他评论和回答建议您需要使用add_test()。如果你想使用 CMake 的 CTest 框架的便利性,你只需要使用 enable_testing()add_test()。如果您愿意,任何可执行文件都可以作为测试。让我们深入了解您的问题。

首先,简化。我假设您已经成功构建了 googletest,并且您知道如何使用它(如果没有,那是一个单独的问题。)减少您的 CMakeLists.txt.

CMakeLists.txt

cmake_minimum_required(VERSION 3.7)
project(expirement)

find_package(Threads REQUIRED)
set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp getstring.cpp tests.cpp)
include_directories($ENV{HOME}/googletest/googletest/include)

add_executable(expirement main.cpp getstring.cpp tests.cpp)
target_link_libraries(expirement
        $ENV{HOME}/googletest/googlemock/gtest/libgtest.a
        $ENV{HOME}/googletest/googlemock/gtest/libgtest_main.a
        )
target_link_libraries(expirement Threads::Threads)

您会注意到我删除了 ExternalProject 位,您可以找出我将 googletest 放在哪里。

现在,由于我们没有您的源代码,我不得不模拟几个存根。

main.cpp

#include "gtest/gtest.h"

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

getstring.h

#include <string>

std::string GetTheString();

getstring.cpp

#include <string>

std::string GetTheString() {
  return (std::string) "asdfasf";
}

现在,cmake 并构建:

~/foo
❯ cmake .
-- The C compiler identification is AppleClang 8.1.0.8020038
-- The CXX compiler identification is AppleClang 8.1.0.8020038
-- Check for working C compiler: /App
[ ... cmake output goes here. blah blah blah ... ]
-- Found Threads: TRUE  
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/nega/foo

~/foo
❯ make
Scanning dependencies of target expirement
[ 25%] Building CXX object CMakeFiles/expirement.dir/main.cpp.o
[ 50%] Building CXX object CMakeFiles/expirement.dir/getstring.cpp.o
[ 75%] Building CXX object CMakeFiles/expirement.dir/tests.cpp.o
[100%] Linking CXX executable expirement
[100%] Built target expirement

~/foo
❯ 

现在运行experiment简化。 (另外,记得转义那些 * !)

~/foo
❯ ./expirement --gtest_filter='*'
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from StringTest
[ RUN      ] StringTest.CheckReturnValue
[       OK ] StringTest.CheckReturnValue (0 ms)
[----------] 1 test from StringTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.

~/foo
❯ 

如果你能做到这一点,那就太好了!你一切顺利。您可以为 --gtest_filter 建立更严格的过滤器。 (记住要转义那些 *!)您可以构建 CMakeLists.txt 以包含您取出的那些 ExternalProject 位。但请记住,ExternalProject 中真正的力量和实用性是当您想要构建外部项目作为项目构建过程的一部分时。很多时候,引导用户自己下载和构建外部项目要简单得多。

如果你没有做到这一点,请停止。退后一步,查看您的代码。确保您已正确设置和定义测试。确保您正确初始化了 googletest。确保您的测试名称中没有任何拼写错误。 (一个常见的 "gotcha"。)修复该部分,然后返回到 CMake 部分。