如何使用Google测试在Main()函数中的特定位置调用特定的测试功能

How can I use Google Test to call specific test functions at specific places in the main() function?

本文关键字:测试 定位 位置 调用 功能 函数 Google 何使用 Main      更新时间:2023-10-16

我正在使用TDD和Google Test进行涉及数值模拟的项目。数据状态在main函数的循环中更改,但是每次更改后都需要满足一些要求。如果满足测试案例的所有要求,则通过了接受测试:

while(simulation)
     modify simulation data
     FIRST_TEST()
     some other simulation operations
     SECOND_TEST()

gtest底漆通常调用了run_all_tests()。高级指南通过从run_all_tests过滤测试来显示如何运行子测试。但是,我想知道如何单独调用测试。

否则,每次我需要在上面的pseudocode片段中进行新的测试和第二个测试时,我都需要编写一个新的接受测试应用程序。

更多背景:我正在为计算流体动力学使用OpenFOAM框架,因此在main之外创建全局固定装置不是一个选择。模拟应用程序需要一个目录和配置文件要运行,并且主体中的全局对象是相关的(需要彼此以进行初始化)。这样的应用程序的一个示例是OpenFOAM-2.2.x。

更多注释

我采用了接受的答案,以及关于如何使用ARGC和ARGV作为堆栈溢出问题的测试中的全局变量的答案,我将其概括为可编译的小型模型,也许有人发现它很有用:

#include <gtest/gtest.h>
#include <iostream>
class Type 
{
    int value_ = 0;
    int times_ = 1; 
    public: 
        Type(int x) : value_(x) {}; 
        void operator()(){
            if (times_ < 10) {
                ++times_; 
                value_ *= times_; 
            }
        }
        int value () const { return value_; } 
}; 
class mySeparatedTests : public ::testing::Test 
{
    protected:
      template<typename Type>
      void TEST_ONE(Type const &t)
      {
          ASSERT_TRUE((t.value() % 2) == 0); 
      }
      template<typename Type> 
      void TEST_TWO(Type const & t)
      {
          ASSERT_TRUE((t.value() - 5) > 0); 
      }
};
TEST_F(mySeparatedTests, testName)
{
    extern char** globalArgv; 
    char** argv = globalArgv;
    // Simulation parameters and objects requiring argc and argv for initialization. 
    int simulationEndTime;  
    *argv[1] >> simulationEndTime;  
    Type typeObject(*argv[2]); 
    TEST_ONE(typeObject); 
    // Simulation loop. 
    for (int i = 0; i < simulationEndTime; ++i)
    {
        typeObject(); 
        TEST_TWO(typeObject); 
    }
}
int globalArgc; 
char** globalArgv; 
int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    globalArgc = argc; 
    globalArgv = argv; 
    return RUN_ALL_TESTS(); 
    return 0; 
}

如接受答案所述,这种方法将仿真代码从main移到test_f中,并使用mySeparatedTests类函数来定义单个测试,然后可以在任何地方调用。这是由:

编译的
g++ -std=c++11 -l gtest main.cpp  -o main

和测试失败/通过取决于解析的参数对;

这失败了:

./main 1 1 

这成功:

./main 2 2 

注意:我知道Char/int转换正在发生;这只是为了展示如何拾取Args。

我的猜测是您有点误解了Googletest的作用。测试序列的控制由测试跑者控制。您可以做的是用while循环定义单个测试,而您的FIRST_TEST等是固定装置的功能,并有一些断言。例如:

而不是:

int main(...) { ... while (...) PERFORM_TEST("A"); ... }
TEST(A,some_test) {}

您可以使用标准的Googletest Runner Main并定义:

// fixture
class MyTest : public ::testing::Test {
protected:
  bool simulation() {
    ///...
  }
  void TEST_A() {
    ASSERT_EQ(...);
    //...
  }
  void TEST_B() {
    ASSERT_EQ(...);
    //...
  }
  ///
};
// the test "runner"
TEST_F(MyTest, main_test) {
  while (simulation()) {
    // modify simulation data
    TEST_A();
    // some other simulation operations
    TEST_B();
  }
}