在Google测试中将多个文件中的测试用例分开

Kil*_*zor 30 c++ googletest

我是谷歌测试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.如果你必须在那里做一些特殊的事情,你将需要有多个构建目标.

  • 对我不起作用。运行可执行文件Alltests SubtractTest时不会被调用。SubtractTest.cpp是否被构建为可执行文件或库? (4认同)
  • 缺少的信息是如何构建它以包含这些单独的文件? (2认同)

Jon*_*nas 6

我认为另一个答案中的主要遗漏点是您需要#include测试文件。

这是我分割测试的方法:

  1. 将测试放在可能带有标头保护的 .h 文件中,但如果您小心的话,则不需要。
  2. 有一个如下定义的主程序,其中包括测试标头
  3. 编译+链接主测试程序的Makefile。

不要在所有文件中使用相同的名称两次进行测试!

// 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)


rst*_*112 6

不寻找学分或积分。我是 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 文件。您不需要在主文件中包含任何测试文件。