使用 CMake 为简单的 header 极简地构建测试
Minimalistically building a test for a simple header using CMake
我有一个 C++ header,其中包含一个 class,其方法如下所示。假设它是我拥有的 header 唯一的图书馆。
// MyHeader.hpp
#pragma once
#include <string>
namespace myheaderonlylibrary {
class MyClass {
public:
unsigned int Func1(const std::string& str) {
if (!str.empty())
return 10;
else
return 0;
}
};
}
为了测试上述方法,我将以下 gtest 源文件放在名为 unittest
的文件夹中,这就像遵循的约定。
// MyTests.cpp
#include <limits.h>
#include "gtest/gtest.h"
#include "../MyHeader.hpp"
TEST(MyTest, Test_Something) {
myheaderonlylibrary::MyClass my_object;
unsigned int expected_value = 0;
EXPECT_EQ(expected_value, my_object.Func1(""));
}
我想做的就是使用 Cmake 和 运行 构建测试。所以,下面是我的 CMakeLists.txt
.
// CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(MyheaderOnlyLibrary_HEADERS
MyHeader.hpp
)
set(MyheaderOnlyLibrary_unittest
unittest/MyTests.cpp
)
find_package(GTest REQUIRED)
enable_testing ()
add_executable(MyheaderOnlyLibraryTests ${MyheaderOnlyLibrary_unittest})
以上设置完成后,我执行 cmake ..
和 make
结果出现以下错误。
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
问题:
我不是 CMake 的专业人士。我的问题是,如果我只想进行 运行 测试,那么我应该做 add_executable
吗?当我唯一想要的是构建和 运行 测试时,这是正确的方法吗?似乎调用 make
时的错误是因为 add_executable
正在寻找 main
方法,就像在普通可执行文件中一样,但没有找到它。
在 header 文件是唯一要测试的东西的情况下,构建仅测试项目的正确方法是什么?
如何运行构建后的测试?看起来有一个命令 CTest
到 运行 使用 CMake 构建的测试?
环境:
我正在 macOS 上使用 clang 作为 C++11 的编译器构建它。
就像一个普通的 C++ 程序一样,您需要有一个 main 函数来执行,对于 googletest 单元测试,您可以使用以下内容:
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
这将在执行时 运行 您的 TEST 函数。
要使用 ctest 实际 运行 您的测试,您的 cmake 文件中应该包含以下行:
find_package(GTest)
include_directories(${GTEST_INCLUDE_DIRS})
include(CTest)
include(GoogleTest)
enable_testing()
target_link_libraries(testName ${GTEST_LIBRARIES})
gtest_discover_tests(testName)
编辑:
作为进入 cmake 之前更容易开始的地方,我建议您从编译和 运行 在命令行上执行您的命令开始。您可以通过以下方式做到这一点:
g++ unittest/myunittest.cpp -o unittest/myunittest.out -lgtest -std=c++11
./unittest/myunittest.out
一旦您知道它有效,请查看 cmake 的文档并使用 cmake 文件重现您的结果。然后你就可以开始扩展你的程序了。了解如何通过命令行 运行 这些命令将使您更好地理解 cmake 正在做什么。
我有一个 C++ header,其中包含一个 class,其方法如下所示。假设它是我拥有的 header 唯一的图书馆。
// MyHeader.hpp
#pragma once
#include <string>
namespace myheaderonlylibrary {
class MyClass {
public:
unsigned int Func1(const std::string& str) {
if (!str.empty())
return 10;
else
return 0;
}
};
}
为了测试上述方法,我将以下 gtest 源文件放在名为 unittest
的文件夹中,这就像遵循的约定。
// MyTests.cpp
#include <limits.h>
#include "gtest/gtest.h"
#include "../MyHeader.hpp"
TEST(MyTest, Test_Something) {
myheaderonlylibrary::MyClass my_object;
unsigned int expected_value = 0;
EXPECT_EQ(expected_value, my_object.Func1(""));
}
我想做的就是使用 Cmake 和 运行 构建测试。所以,下面是我的 CMakeLists.txt
.
// CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
set(MyheaderOnlyLibrary_HEADERS
MyHeader.hpp
)
set(MyheaderOnlyLibrary_unittest
unittest/MyTests.cpp
)
find_package(GTest REQUIRED)
enable_testing ()
add_executable(MyheaderOnlyLibraryTests ${MyheaderOnlyLibrary_unittest})
以上设置完成后,我执行 cmake ..
和 make
结果出现以下错误。
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
问题:
我不是 CMake 的专业人士。我的问题是,如果我只想进行 运行 测试,那么我应该做 add_executable
吗?当我唯一想要的是构建和 运行 测试时,这是正确的方法吗?似乎调用 make
时的错误是因为 add_executable
正在寻找 main
方法,就像在普通可执行文件中一样,但没有找到它。
在 header 文件是唯一要测试的东西的情况下,构建仅测试项目的正确方法是什么?
如何运行构建后的测试?看起来有一个命令 CTest
到 运行 使用 CMake 构建的测试?
环境:
我正在 macOS 上使用 clang 作为 C++11 的编译器构建它。
就像一个普通的 C++ 程序一样,您需要有一个 main 函数来执行,对于 googletest 单元测试,您可以使用以下内容:
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
这将在执行时 运行 您的 TEST 函数。
要使用 ctest 实际 运行 您的测试,您的 cmake 文件中应该包含以下行:
find_package(GTest)
include_directories(${GTEST_INCLUDE_DIRS})
include(CTest)
include(GoogleTest)
enable_testing()
target_link_libraries(testName ${GTEST_LIBRARIES})
gtest_discover_tests(testName)
编辑: 作为进入 cmake 之前更容易开始的地方,我建议您从编译和 运行 在命令行上执行您的命令开始。您可以通过以下方式做到这一点:
g++ unittest/myunittest.cpp -o unittest/myunittest.out -lgtest -std=c++11
./unittest/myunittest.out
一旦您知道它有效,请查看 cmake 的文档并使用 cmake 文件重现您的结果。然后你就可以开始扩展你的程序了。了解如何通过命令行 运行 这些命令将使您更好地理解 cmake 正在做什么。