【发布时间】:2011-09-16 11:24:19
【问题描述】:
我是谷歌测试 C++ 框架的新手。它很容易使用,但我想知道如何将案例分成多个测试文件。最好的方法是什么?
直接包含 .cpp 文件是一种选择。使用标头似乎无济于事...
欢迎任何帮助
【问题讨论】:
标签: c++ googletest
我是谷歌测试 C++ 框架的新手。它很容易使用,但我想知道如何将案例分成多个测试文件。最好的方法是什么?
直接包含 .cpp 文件是一种选择。使用标头似乎无济于事...
欢迎任何帮助
【问题讨论】:
标签: c++ googletest
创建一个只包含运行测试的主文件。
// AllTests.cpp
#include "gtest/gtest.h"
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
然后将测试放入其他文件中。您可以在一个文件中放置任意数量的测试。为每个类或每个源文件创建一个文件效果很好。
// SubtractTest.cpp
#include "subtract.h"
#include "gtest/gtest.h"
TEST(SubtractTest, SubtractTwoNumbers)
{
EXPECT_EQ(5, subtract(6, 1));
}
这确实要求所有测试都可以共享同一个主目录。如果你必须在那里做一些特别的事情,你将必须有多个构建目标。
【讨论】:
.cpp 文件后,您的测试没有运行,请访问您的 google - 在 Xcode 中测试驱动的 C++ 目标并在构建选项中激活 Perform Single-Object prelink。
不寻找积分或积分。我是 stackoverflow 的新手,没有添加 cmets 的声誉。 @jkoendev 的回答尽管在技术上是正确的,但做出了不正确的陈述“我认为另一个答案中的主要缺失点是您需要#include 测试文件。”不正确,您只需将所有 CPP 文件链接在一起。
例如在 CMAKE 中
add_executable(${PROJECT_NAME}
${sources}
${headers})
还有一个
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
链接所有的 cpp 文件。 您无需在主文件中包含任何测试文件。
【讨论】:
我认为另一个答案中的主要缺失点是您需要 #include 测试文件。
这是我拆分测试的方法:
不要在所有文件中两次使用相同的名称进行测试!
// main_test.cc
#include <gtest/gtest.h>
#include "test_a.h"
#include "test_b.h"
#include "test_c.h"
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用来自 googletest 的 Makefile 并添加规则:
# compiles main test program
main_test.o : main_test.cc test_a.h test_b.h test_c.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
# links test program
main_test : main_test.o
$(CXX) $(LDFLAGS) -L$(GTEST_LIB_DIR) $^ -lgtest_main -lpthread -o $@
我使用命名约定按字母顺序排列测试:
// test_a.h
#include "some_class.h"
TEST(SomeClass, aName)
{
library::SomeClass a("v", {5,4});
EXPECT_EQ(a.name(), "v");
}
TEST(SomeClass, bSize)
{
library::SomeClass a("v", {5,4});
EXPECT_EQ(a.size(0), 5);
EXPECT_EQ(a.size(1), 4);
}
然后你可以运行单独的测试
./main_test --gtest_filter=SomeClass.a*
【讨论】:
我最近遇到了同样的问题。
我将 test_cases.o 和 main.o 归档到静态库 (test_main.a) 中,然后将它们与其他库链接到最终可执行文件。
我注意到如果我链接test_main.a,它找不到测试用例。
g++ -o test test_main.a -lgtest -lpthread -lXXX
但是,如果我分别链接对象,它会起作用!
g++ -o test test_cases.o main.o -lgtest -lpthread -lXXX
我在这篇帖子Why create a .a file from .o for static linking?中找到了答案
最后的链接步骤有一个重要区别。您链接的任何目标文件都将包含在最终程序中。仅当库中的目标文件有助于解析其他目标文件中的任何未定义符号时,才会包含这些目标文件。如果不这样做,它们将不会链接到最终的可执行文件中。
我怀疑这与 Google Test 的设计有关。
RUN_ALL_TESTS() 宏动态运行测试类的所有实例,这意味着它在运行时期间获取了测试用例。
因此,不需要链接测试类的实例,因此链接器不会链接test_case.o。
【讨论】: