【问题标题】:Separate test cases across multiple files in google test在谷歌测试中跨多个文件分离测试用例
【发布时间】:2011-09-16 11:24:19
【问题描述】:

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

直接包含 .cpp 文件是一种选择。使用标头似乎无济于事...

欢迎任何帮助

【问题讨论】:

    标签: c++ googletest


    【解决方案1】:

    创建一个只包含运行测试的主文件。

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

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

    【讨论】:

    • 如果您在 Xcode 中使用 google-test(也可能使用 Objective-C++),并且在将您的测试套件拆分为不同的 .cpp 文件后,您的测试没有运行,请访问您的 google - 在 Xcode 中测试驱动的 C++ 目标并在构建选项中激活 Perform Single-Object prelink
    • 对我不起作用。运行可执行的 Alltests SubtractTest 时不会调用。 SubtractTest.cpp 是否正在构建为可执行文件或库?
    • 缺少的信息是如何构建它以包含这些单独的文件?
    【解决方案2】:

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

    例如在 CMAKE 中

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

    还有一个

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        我将 test_cases.omain.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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-30
          相关资源
          最近更新 更多