2011-11-23 65 views
2

我有一個C模塊,我想重構一點點。有一些全局變量和結構不隱藏(在module.h文件中)。我在一些測試用例中使用這些變量,但在其他地方使用這些變量,因此我認爲將它們設置爲靜態是個好主意。在我的測試用例中,我將這些變量外接並填充測試值。但是如果它們是靜態變量,我無法從測試用例中找到它們。我不想寫getter和setter方法,並把它放到.h文件中,因爲我想隱藏這個變量。單元測試C模塊靜態變量

我知道如果我包含.c文件到我的測試用例我可以看到靜態變量。 有沒有其他方法來填補這些變數?

我使用cygwin和gcc,測試框架是CppUtest。

在此先感謝。

+0

顯然你想調試,而不是執行單元測試... – pmg

回答

2

主要有兩種可能性:

  1. 測試的難度是表示由模塊提供的接口是不完整的。
  2. 您的單元測試以消費者永遠不需要的方式撬入模塊的內部。

如果問題是不完整的接口,那麼您可以添加額外的接口,使模塊更容易測試,並且更通用。例如,如果靜態變量是某種類型的計數器,則可能需要添加一個「重置」方法來將計數器設置回零,準備進行單元測試的下一部分,或者(在更一般的用例中)讓統計數據歸零,以便您可以重新累計統計數據。

如果問題是單元測試需要比消費者需要探測更深的探測,那麼我使用#include "sourcecode.c"沒有看到測試代碼有任何問題。它保持模塊代碼清潔以供一般使用;它允許單元測試比其他方法更深入地探測。它將測試代碼從「黑盒」測試轉換爲「白盒」測試形式 - 測試可以看到比常規黑盒測試更多的測試代碼。但有時候這很有幫助。它通常是發展過程中的中間階段。一旦你完成了所有的黑盒測試,你可能不需要關心以同樣的方式探測內部 - 直到你做出改變。

+0

我認爲在我的情況下intarface不是不完整的,我傾向於將整個c文件包含到我的測試用例中,從技術上講,這意味着它們在同一個編譯單元中,所以測試用例可以看到靜態但是說實話:我不喜歡這個想法,它看起來像一個解決方法,有沒有我沒有注意到的解決方案? – hcpeter

+0

不,因此我概述了兩種可能性:如果界面不完整,我建議完成它。例如,我正在處理一些與語言環境相關的格式代碼。更簡單的函數使用'當前語言環境',但測試這將是一個完整的婊子。我已經通過提供以'locale'作爲參數的泛型函數來完成界面,並且最容易使用的函數(沒有locale)簡單地查找當前語言環境,然後調用泛型函數。我可以用各種各樣的古怪語言環境來測試泛型函數,否則就不可能。 –

+0

謝謝喬納森我意識到這是一個可行的選擇。所以我包含了整個c文件,併爲靜態變量賦予了初始值。我現在可以測試模塊。 – hcpeter

0

在一個單獨的文件中創建這些靜態變量通常是一個好主意(有些人喜歡稱它爲腳手架),這樣你就可以遠離包含.c。這背後的基本理論是,如果你總是包含.c文件,那麼單元測試很快就變得不可能了,因爲單元測試的整個想法是深入並測試一小段代碼而不依賴於其餘部分。一旦你包含所有這些外部.c文件,你就不會這樣做。

+0

感謝您的建議,它聽起來比我將整個c文件包括到測試用例中更好。但是......我來自java和jUnit,並且切換c方法有點困難( - : – hcpeter

+0

Java確實使單元測試更容易,我喜歡你如何在每個文件中使用主要方法。 C無論如何 – dbeer