簡體   English   中英

如何使用Google Test在main()函數中的特定位置調用特定的測試函數?

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

我正在將TDD和Google Test用於涉及數值模擬的項目。 數據狀態在main函數的一個循環內得到更改,但是每次更改后都需要滿足一些要求。 如果滿足一個測試用例的所有要求,則接受測試通過:

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

GTest入門指出,通常會調用RUN_ALL_TESTS()。 高級指南》通過過濾掉 RUN_ALL_TESTS中的測試,展示了如何運行子測試。 但是,我想知道如何分別調用測試。

否則,每次我需要上面偽代碼段中的新測試(例如FIRST_和SECOND_)時,就需要編寫一個新的驗收測試應用程序。

更多背景知識:我正在使用OpenFOAM框架進行計算流體動力學,因此不能在main之外創建全局夾具。 該模擬應用程序需要目錄和配置文件才能運行,並且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轉換正在發生; 這只是為了展示如何獲取參數。

我的猜測是您對googletest的功能略有誤解。 測試順序的控制由測試運行程序控制。 您可以做的是使用while循環定義一個測試,區別在於FIRST_TEST等是具有某些斷言的FIRST_TEST函數。 例如:

代替:

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

您可以使用標准的googletest運行器主體並定義:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM