我是谷歌测试C++框架的新手.它很容易使用,但我想知道如何将案例分成多个测试文件.什么是最好的方法?
直接包含.cpp文件是一个选项.使用标题似乎什么都不做......
欢迎任何帮助
小智 34
创建一个仅包含运行测试的main的文件.
// AllTests.cpp
#include "gtest/gtest.h"
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)
然后将测试放入其他文件中.您可以在文件中放置任意数量的测试.为每个类或每个源文件创建一个文件可以很好地工作.
// SubtractTest.cpp
#include "subtract.h"
#include "gtest/gtest.h"
TEST(SubtractTest, SubtractTwoNumbers)
{
EXPECT_EQ(5, subtract(6, 1));
}
Run Code Online (Sandbox Code Playgroud)
这确实要求所有测试都可以共享相同的main.如果你必须在那里做一些特殊的事情,你将需要有多个构建目标.
我认为另一个答案中的主要遗漏点是您需要#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();
}
Run Code Online (Sandbox Code Playgroud)
使用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 $@
Run Code Online (Sandbox Code Playgroud)
我使用命名约定按字母顺序对测试进行排序:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以运行单独的测试
./main_test --gtest_filter=SomeClass.a*
Run Code Online (Sandbox Code Playgroud)
不寻找学分或积分。我是 stackoverflow 的新手,没有添加评论的声誉。@jkoendev 的回答尽管在技术上是正确的,但做出了错误的陈述“我认为另一个答案中的主要缺失点是您需要 #include 测试文件。” 不正确,您只需要将所有 CPP 文件链接在一起。
例如在 CMAKE
add_executable(${PROJECT_NAME}
${sources}
${headers})
Run Code Online (Sandbox Code Playgroud)
随着一个
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
Run Code Online (Sandbox Code Playgroud)
链接所有 cpp 文件。您不需要在主文件中包含任何测试文件。