簡體   English   中英

測試夾具中的設置與構造函數

[英]SetUp vs Constructor in Test Fixture

為什么測試裝置在 Google Test 中有 SetUp 方法? 構造函數實際上不是一回事嗎? TearDown 方法也是如此。 對SetUp 和Constructor 以及TearDown 和Destructor 的調用與TestEventListeners 一致:OnTestStart 和OnTestEnd。

常見問題中一個答案

我應該使用測試裝置的構造函數/析構函數還是設置/拆卸函數?

首先要記住的一點是,googletest重復使用多個測試相同的測試夾具對象。 對於每個TEST_F ,googletest 將創建一個新的測試夾具對象,立即調用SetUp() ,運行測試主體,調用TearDown() ,然后刪除測試夾具對象。

當您需要編寫每個測試的設置和拆卸邏輯時,您可以選擇使用測試裝置構造函數/析構函數或SetUp()/TearDown() 前者通常是首選,因為它具有以下優點:

  • 通過在構造函數中初始化成員變量,我們可以選擇使其成為const ,這有助於防止對其值的意外更改並使測試更明顯正確。
  • 在情況下,我們需要繼承測試夾具類,子類的構造函數是保證調用基類的第一個構造,和子類析構函數是保證調用基類的析構函數之后 使用SetUp()/TearDown() ,子類可能會犯錯誤,忘記調用基類的SetUp()/TearDown()或在錯誤的時間調用它們。

在以下極少數情況下,您可能仍想使用SetUp()/TearDown()

  • 在構造函數(或析構函數)的主體中,不能使用ASSERT_xx宏。 因此,如果設置操作可能導致應該阻止測試運行的致命測試失敗,則有必要使用CHECK宏或使用SetUp()而不是構造函數。
  • 如果拆卸操作可能拋出異常,則必須使用TearDown()而不是析構函數,因為拋出析構函數會導致未定義的行為,並且通常會立即終止您的程序。 請注意,當在編譯器中啟用異常時,許多標准庫(如 STL)可能會拋出異常。 因此,如果您想編寫有或沒有異常的可移植測試,您應該更喜歡TearDown()
  • googletest 團隊正在考慮在啟用異常的平台(例如 Windows、Mac OS 和 Linux 客戶端)上拋出斷言宏,這將消除用戶將故障從子例程傳播到其調用者的需要。 因此,如果您的代碼可以在這樣的平台上運行,則不應在析構函數中使用 googletest 斷言。
  • 在構造函數或析構函數中,您不能對該對象進行虛函數調用。 (您可以調用聲明為虛擬的方法,但它將被靜態綁定。)因此,如果您需要調用將在派生類中覆蓋的方法,則必須使用SetUp()/TearDown()

暫無
暫無

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

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