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

时间:2011-09-16 11:24:19

标签: c++ googletest

我是谷歌测试C ++框架的新手。它很容易使用,但我想知道如何将案例分成多个测试文件。什么是最好的方式?

直接包含.cpp文件是一个选项。使用标题似乎什么都不做......

欢迎任何帮助

4 个答案:

答案 0 :(得分:30)

创建一个仅包含运行测试的main的文件。

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

这确实要求所有测试都可以共享相同的主要内容。如果你必须在那里做一些特别的事情,你将需要有多个构建目标。

答案 1 :(得分:4)

不寻找积分或积分。我是stackoverflow的新手,并且没有添加评论的名声。尽管技术上正确,但@jkoendev的答案却做出了错误的陈述:“我认为另一个答案的主要缺失点是您需要#include测试文件。”并非如此,您只需要将所有CPP文件链接在一起。

例如CMAKE

add_executable(${PROJECT_NAME} 
    ${sources}
    ${headers})

以及

file(GLOB_RECURSE sources
    ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

链接所有cpp文件。 您不需要在主文件中包含任何测试文件。

答案 2 :(得分:1)

我认为另一个答案的主要缺失点是您需要#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();
}

使用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*

答案 3 :(得分:0)

我最近也遇到了同样的问题。

我将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。