2009-06-22 49 views
7

我不能對代碼的某些部分使用單元測試,因此我要回歸回歸測試。 我想檢查一下我的程序在修改後是否以相同的方式運行。 而行爲我的意思大都是數據結構的狀態。 到目前爲止,我將它們序列化爲人類可讀的文本格式,並在第一次運行時轉儲到某些文件。然後在接下來的轉儲中,我可以比較狀態是否改變。 如果更改來自新功能而不是來自錯誤,則更新它。C++中的迴歸測試

我可以使用庫(C++)來組織所有這些。你知道任何? 與轉儲文件一起,它將提供廉價,大規模的單元測試。

最麻煩的事情是序列化過程。有時我只是轉儲內存狀態,但當它不同時,很難進行反向工程。所以我轉向另一種方法。現在,在比較階段,我將內存轉儲讀入一個「幻像」對象,並運行專門的diff方法(運算符==帶有豐富的錯誤報告),有時比序列化爲人類可讀的文本格式更容易編寫。

基本上我覺得重新發明輪子,所以我的問題是相當一般的:
你如何執行迴歸測試(如果你這樣做)?
你使用任何庫/工具包嗎?
你有沒有爲自己的需要實施一個?

只是出於好奇:
你有沒有想過做迴歸測試,但有些東西阻止了你?

+0

只是出於好奇...爲什麼你不能使用單元測試? – nathan 2009-06-22 00:47:02

回答

2

你可以看看the Boost Test Library 。我從來沒有使用它,但它可能會滿足你的願望。

當我在工作時,我通常會在我們的測試跟蹤器中編寫簡單的測試用例,以使迴歸測試儘可能地簡單(尤其對於不是我的人:)。

2

檢查出增強serialization庫。這將允許您將文件轉儲到xml,然後您可以對每個版本進行比較。

爲了創建您的測試用例,如果您還沒有這樣做,請使用gcov通過您的函數來計算覆蓋範圍。這至少會確保你的函數中包含了所有的陳述。

單元測試

當我們正在測試一個缺少燈具的遺留代碼,我們有時會使用一箇中間立場的做法。我們所擁有的是我們的應用程序的稍微修改版本,它執行常規任務,但也可以對函數執行測試。

它不是嚴格意義上的單元測試,因爲您必須假定庫的其餘部分是正確的,但是,它至少允許您執行比迴歸/系統測試可能更多的測試。

1

好的,這裏討論了三件事:在C++中將測試用於遺留代碼,單元測試和驗收/迴歸測試。

首先,爲了將遺留代碼和擬合測試帶入它,我建議您購買Michael Feathers的「有效工作與遺留代碼」副本。它是一本很棒的書,並會教你任何遺留代碼可以進行單元測試!我用這本書中的技術來測試每個人都告訴我的東西不能進行單元測試,但無論如何我都是這麼做的:-)。其次,對於使用C++進行單元測試,我只寫了一個由5部分組成的系列博客文章,描述瞭如何使用Visual Studio詳細執行此操作:C++ Unit Testing With Boost.Test

最後,對於驗收/迴歸測試,我已成功使用Fitnesse。這基本上是一個驗收測試框架,它使用wiki來組織和編寫測試。維基頁面被遍歷和解析,以轉化爲您編寫的測試夾具的調用。測試夾具然後在測試(如wiki頁面所述)和您的生產代碼之間進行調解。我已經使用這種機制在整個應用程序端到端執行迴歸測試。將它與單元測試結合起來,用於你正在改變的類和它非常強大的錯誤檢測機制。迴歸測試從上方擠壓,單元測試從下面擠壓,錯誤在中間被捕獲!它對我很好。

fitnesse.org獲取主要的fitnesse分佈您可以從sourceforge獲得FitNesse的C++測試運行器。 (我是該項目的開發人員。)我們還沒有在主要的fitnesse wiki中添加SLIM支持,但我們確實對幾種固件有很好的支持。我們希望很快添加SLIM支持。我有一個基本的實現需要完成。