程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Google C++單元測試框架---Google TestExtending Google Test by Handling Test Events,unittest框架

Google C++單元測試框架---Google TestExtending Google Test by Handling Test Events,unittest框架

編輯:C++入門知識

Google C++單元測試框架---Google TestExtending Google Test by Handling Test Events,unittest框架


Google TestExtending Google Test by Handling Test Events

Google測試提供了一個事件偵聽器API,讓您接收有關測試程序進度和測試失敗的通知。 可以監聽的事件包括測試程序的開始和結束,測試用例或測試方法等。 您可以使用此API來擴充或替換標准控制台輸出,替換XML輸出,或提供完全不同的輸出形式,例如GUI或數據庫。 例如,您還可以使用測試事件作為檢查點來實現資源洩漏檢查器。

一、定義事件偵聽器

要定義一個事件監聽器,你需要繼承testing :: TestEventListener或testing :: EmptyTestEventListener。前者是一個(抽象)接口,其中每個純虛方法
可以重寫以處理測試事件(例如,當測試開始時,將調用OnTestStart()方法。)。後者提供了接​​口中所有方法的空實現,使得子類只需要覆蓋它關心的方法。

當一個事件觸發時,它的上下文作為參數傳遞給處理函數。使用以下參數類型

  • UnitTest反映整個測試程序的狀態,
  • TestCase包含關於一個測試用例的信息,它可以包含一個或多個測試,
  • TestInfo包含測試的狀態,和
  • TestPartResult表示測試斷言的結果。

事件處理函數可以檢查它接收的參數,以找到關於事件和測試程序狀態的有趣信息。這裡有一個例子:

class MinimalistPrinter : public ::testing::EmptyTestEventListener {
    // Called before a test starts.
    virtual void OnTestStart(const ::testing::TestInfo& test_info) {
      printf("*** Test %s.%s starting.\n",
             test_info.test_case_name(), test_info.name());
    }

    // Called after a failed assertion or a SUCCEED() invocation.
    virtual void OnTestPartResult(
        const ::testing::TestPartResult& test_part_result) {
      printf("%s in %s:%d\n%s\n",
             test_part_result.failed() ? "*** Failure" : "Success",
             test_part_result.file_name(),
             test_part_result.line_number(),
             test_part_result.summary());
    }

    // Called after a test ends.
    virtual void OnTestEnd(const ::testing::TestInfo& test_info) {
      printf("*** Test %s.%s ending.\n",
             test_info.test_case_name(), test_info.name());
    }
  };

二、使用事件監聽器

要使用您定義的事件偵聽器,請將其實例添加到Google Test事件偵聽器列表中(由TestEventListeners類表示)

  • note the "s" at the end of the name) in your main() function, before calling RUN_ALL_TESTS():
int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  // Gets hold of the event listener list.
  ::testing::TestEventListeners& listeners =
      ::testing::UnitTest::GetInstance()->listeners();
  // Adds a listener to the end.  Google Test takes the ownership.
  listeners.Append(new MinimalistPrinter);
  return RUN_ALL_TESTS();
}

  只有一個問題:默認測試結果打印機仍然有效,因此其輸出將與您的簡約打印機的輸出混合。 要禁止默認打印機,只需從事件偵聽器列表中釋放它並刪除它。 您可以添加一行:

...
  delete listeners.Release(listeners.default_result_printer());
  listeners.Append(new MinimalistPrinter);
  return RUN_ALL_TESTS();

現在,坐下來享受與你的測試完全不同的輸出。 有關更多詳細信息,您可以閱讀此示例 sample(sample9_unittest)。

您可以向列表附加多個偵聽器。 當On * Start()或OnTestPartResult()事件觸發時,監聽器將按它們在列表中顯示的順序接收它(因為新的監聽器添加到列表的末尾,默認文本打印機和默認XML生成器 將第一時間接收事件)。 An On * End()事件將由偵聽器以相反的順序接收。 這允許稍後添加的偵聽器的輸出由之前添加的偵聽器的輸出構成。

三、Generating Failures in Listeners

在處理事件時,可以使用故障提升宏(EXPECT _ *(),ASSERT _ *(),FAIL()等)。 有一些限制:

  • 你不能在OnTestPartResult()中產生任何失敗(否則會導致OnTestPartResult()被遞歸調用)。
  • 處理OnTestPartResult()的偵聽器不允許生成任何失敗。

當您向偵聽器列表添加偵聽器時,應該在可能生成失敗的偵聽器之前放置處理OnTestPartResult()的偵聽器。 這確保由後者產生的故障歸因於前者的正確測試。

我們在這裡有一個失敗監聽器的示例here(sample10_unittest)。

四、TestEventListener接口

// The interface for tracing execution of tests. The methods are organized in
// the order the corresponding events are fired.
class TestEventListener {
 public:
  virtual ~TestEventListener() {}

  // Fired before any test activity starts.
  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;

  // Fired before each iteration of tests starts.  There may be more than
  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
  // index, starting from 0.
  virtual void OnTestIterationStart(const UnitTest& unit_test,
                                    int iteration) = 0;

  // Fired before environment set-up for each iteration of tests starts.
  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;

  // Fired after environment set-up for each iteration of tests ends.
  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;

  // Fired before the test case starts.
  virtual void OnTestCaseStart(const TestCase& test_case) = 0;

  // Fired before the test starts.
  virtual void OnTestStart(const TestInfo& test_info) = 0;

  // Fired after a failed assertion or a SUCCEED() invocation.
  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;

  // Fired after the test ends.
  virtual void OnTestEnd(const TestInfo& test_info) = 0;

  // Fired after the test case ends.
  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;

  // Fired before environment tear-down for each iteration of tests starts.
  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;

  // Fired after environment tear-down for each iteration of tests ends.
  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;

  // Fired after each iteration of tests finishes.
  virtual void OnTestIterationEnd(const UnitTest& unit_test,
                                  int iteration) = 0;

  // Fired after all test activities have ended.
  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
};

// The convenience class for users who need to override just one or two
// methods and are not concerned that a possible change to a signature of
// the methods they override will not be caught during the build.  For
// comments about each method please see the definition of TestEventListener
// above.一個空實現
class EmptyTestEventListener : public TestEventListener {
 public:
  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
                                    int /*iteration*/) {}
  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
                                  int /*iteration*/) {}
  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
};

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved