2008-10-09 69 views
8

我正在研究一個C++庫(其他東西)有讀取配置文件的功能;我想爲此添加測試。到目前爲止,這導致我創建了大量有效和無效的配置文件,每個配置文件只有幾行可以測試一個特定的功能。但它現在變得非常笨拙,因爲有這麼多的文件,還有很多小的C++測試應用程序。不知何故,這對我來說似乎是錯誤的:-)所以你有什麼提示如何組織所有這些測試,測試應用程序和測試數據?如何組織C++測試應用程序和相關文件?

注意:庫的公共API本身不易測試(它需要配置文件作爲參數)。實際閱讀和解釋配置值的多汁,容易出錯的方法是私有的,所以我沒有看到直接測試它們的方法?

所以:你會堅持測試真實的文件;如果是這樣,你將如何組織所有這些文件和應用程序,以便它們仍然可以維護?

回答

5

也許庫可以接受某種流輸入,所以你可以傳入類似字符串的對象並避免所有的輸入文件?或者根據配置類型,您可以提供「get/setAttribute()」函數來直接,公開,調整參數。如果這不是一個真正的設計目標,那麼沒關係。數據驅動的單元測試在一些地方被忽視,但它肯定比沒有好!我可能會制定出這樣的代碼:

project/ 
      src/ 
      tests/ 
       test1/ 
         input/ 
       test2 
         input/ 

在每testN目錄你會關聯到輸入目錄中的配置文件的cpp文件。

然後,假設您正在使用的xUnit風格的測試庫(cppunitgoogletestunittest++,或其他),你可以添加各種的testXXX()函數來一個類來測試的功能相關聯基團。這樣,您可以通過將至少一些測試分組在一起來削減部分小程序問題。

唯一的問題是,如果庫期望配置文件被稱爲特定的東西,或在一個特定的地方。這不應該是這種情況,但是如果它必須通過將測試文件複製到預期位置來解決。

不要擔心大量的測試會讓你的項目混亂,如果他們藏在測試目錄中,那麼他們就不會打擾任何人。

0

在一些測試中,我已經使用測試代碼來編寫配置文件,然後在測試使用該文件後將其刪除。它在一定程度上填充了代碼,我不知道這是否是好的做法,但它工作。如果您碰巧使用boost,那麼它的文件系統模塊對創建目錄,導航目錄和刪除文件很有用。

0

我同意@Richard Quirk所說的,也可能希望讓測試套件類成爲您正在測試的類的朋友並測試其私有函數。

1

第1部分:

正如理查德的建議,我想看看在CPPUnit測試框架。這將在一定程度上推動測試框架的位置。

根據Richard的示例,您的測試可以位於高級並行目錄中,也可以位於與要測試的區域平行的測試子目錄或測試目錄中。

無論哪種方式,請在項目的目錄結構中保持一致! 尤其是在測試包含在單個高級目錄中的情況下。

還有什麼比不得不維持在如位置的源代碼中的心理映射:

/project/src/component_a/piece_2/this_bit 

且位於測試(S)的地方,如:

/project/test/the_first_components/connection_tests/test_a 

而且我曾參與過有人這樣做的項目!

什麼是浪費wetware週期! 8-O談論違反亞歷山大的質量而不命名的概念。

更好的是讓您的測試始終位於w.r.t.下測試的源代碼的位置:

/project/test/component_a/piece_2/this_bit/test_a 

第2部分

作爲用於API配置文件,使基準配置的本地副本在每個局部測試區域作爲測試ENV的一部分。在執行測試之前運行的設置。不要在您的測試樹中添加配置(或數據)的副本。

HTH。

歡呼聲,

羅布

BTW非常高興見到你問這個現在設置東西的時候!

0

對於這樣的事情,我總是有一個小實用程序類,它會將配置加載到內存緩衝區中,並從那裏獲取到實際配置類中。這意味着真正的來源並不重要 - 它可能是一個文件或數據庫。對於單元測試,它在std :: string中被硬編碼,然後傳遞給類進行測試。您可以輕鬆模擬currup!pte3d數據以測試故障路徑。我想用UnitTest++。我將測試作爲src樹的一部分。所以:

solution/project1/src <-- source code 
solution/project1/src/tests <-- unit test code 
solution/project2/src <-- source code 
solution/project2/src/tests <-- unit test code 
0

假設你有在圖書館的設計控制,我希望你會能夠重構,這樣你分開實際文件從將其解釋爲一個配置文件讀取的擔憂:

  1. 類的FileReader讀取文件,併產生一個輸入流,
  2. 類ConfigFileInterpreter驗證/解釋等的輸入流的內容

現在要測試FileReader,您只需要非常少量的實際文件(空白,二進制,純文本等),而對於ConfigFileInterpreter,您將使用FileReader類的存根,該文件返回輸入流以讀取。現在,您可以將所有各種配置情況準備爲字符串,而不必閱讀太多文件。

0

您不會發現比CppUnit更差的單元測試框架。說真的,任何推薦CppUnit的人都沒有真正看過任何競爭的框架。

所以是的,去一個單位測試franework,但不要使用CppUnit。