2009-02-23 332 views
36

Quickcheck及其變體(即使在Java中有一個),似乎很有趣。然而,除了學術興趣之外,它在真正的應用程序測試(例如,GUI應用程序或客戶端/服務器,甚至是StackOverflow本身)中真的有用嗎?你有類似的測試發生器的任何經驗值得讚賞。您是否在實際項目中使用了Quickcheck

回答

48

是的,好吧。其實不是,但我已經研究過最初開發QuickCheck的人,他是一個非常有趣的人。我們不得不使用QuickCheck來測試我們的Haskell程序,它是好的和壞的組合。最糟糕的是因爲Haskell本身有點令人生畏,但當你得到它的時候從來就不是那麼美妙。

約翰從那時起就完善了他多年前寫的內容,實際上幫助Ericssion測試了他們複雜的電信硬件,他發現了2000萬左右的代碼行,通過他的方法僅僅通過三個步驟就減少了這一點。他是一位出色的演講者,所以總能聽到他展示他的表現如何,但總而言之,他對QuickCheck所做的一切對我來說都是新鮮事。所以我問他,他的興趣是什麼把它推向市場。他對這個想法持開放態度,但當時他的業務(基於QuickCheck)相對較新,所以還有其他領域需要關注。現在是2007年。我的觀點是,即使你不使用它,你也可以從QuickCheck學習。

但什麼是QuickCheck?這是一個組合測試框架和測試程序的有趣方式。在微軟研究院的人們已經建立了Pex這是類似的。 Pex通過檢查您的IL自動生成測試。但是,John會爲函數的可能輸入和測試屬性編寫一個生成器。一個屬性是可以很容易地進行測試的東西,它更加正式。例如顛倒名單?那麼,顛倒一個列表,就像將列表分成兩部分一樣,分別顛倒它們,然後按相反的順序連接兩個相反的部分。

1,2,3,4 // original 
1,2 3,4 // split into A and B 
2,1 4,3 // reverse A and B 
4,3,2,1 // concat B and A 

這是用QuickCheck測試稱爲規範的一個很棒的屬性,結果非常驚人。

Pex很好,但不像QuickCheck那麼酷,Pex簡化了一切,QuickCheck的確做到了,但編寫一個好的規範需要花費很多精力。

QuickCheck的威力在於,當它發生故障時,它會將導致測試失敗的輸入減少到儘可能最小的形式。留下你詳細的描述什麼樣的進展狀態導致你的測試失敗。與其他測試框架相比,它們只是試圖以暴力方式破壞您的代碼。

由於您如何編寫測試規範,這成爲可能。 QuickCheck依靠僞隨機性來發明輸入,正因爲如此,它能夠回溯並發現非常小的輸入,並且不能通過測試。

編寫QuickCheck屬性還有很多工作要做,但最終的結果是更好的測試。正如約翰自己所說的,70%的錯誤是由單元測試捕獲的,但其他30%會導致程序崩潰。 QuickCheck正在測試最後的30%。

+2

很好說。然而,回到我的問題,我們可以在其他情況下使用它的功能可能不純(它可能只是作爲副作用)。假設一個函數將文件從一個位置複製到另一個位置。 – amit 2009-02-23 09:57:24

+1

哦,當然,你的功能有副作用並不是真正的問題。本身存在問題,但並不妨礙您使用QuickCheck。 Ericssion測試服有副作用,你可以繞過這個方法。 – 2009-02-23 12:25:17

7

我用快速檢查了很多個人的東西。在過去六個月內:

  • Ran QuickCheck在圖像壓縮器中測試顏色變換和離散餘弦變換。

  • Ran QuickCheck測試一個符號分化模塊,我爲了一些數值優化而進行了測試。

  • Ran QuickCheck測試Bentley和Sedgewick風格的三元搜索樹。

快速檢查很少符合所有我的單元測試的需求,但它是開始的好方法---和快速檢查法做出良好的文檔。

8

我做了一個真正的Haskell問題,其中涉及到離散事件模擬。於是我寫了一個基於繼續monad的DES庫,以及MVars和Channels的等價物。我需要檢查這個工作是否正常,所以我編寫了一堆QuickCheck屬性來演示,例如,寫入通道的兩個併發數據流將被正確合併而不會丟失任何內容。

我也用QuickCheck來記錄和驗證我的Ranged SetsDecimal庫中的屬性。

根據我的經驗,QuickCheck有時很棒。如果您能夠以簡潔的方式總結一個重要的屬性,雖然提供該屬性的算法很有趣,但QuickCheck是一個巨大的勝利。另一方面,我經常發現算法等價於我想驗證的屬性。在這種情況下,我尋找更簡單的屬性。例如,假設函數「foo」應該是非嚴格單調的。然後你可以寫

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y) 
2

我只在生產環境中使用Haskell來開發小幫助工具。主要是因爲我是唯一讀過Haskell的開發人員。儘管我廣泛使用了QuickCheck,並且非常惱火,類似的東西在C#中不可用。所以我決定嘗試和write it myself。我也看了Pex,但發現程序探索技術被用來尋找最少的輸入,而不像QuickCheck那樣有趣。

3

AFAIK XMonad與快速檢查

2

我用快速檢查測試的任何語言編寫的命令行程序的行爲廣泛的測試。

找到低級別或動態類型程序崩潰的輸入特別有用。

爲方便起見,我寫了http://hackage.haskell.org/package/proctest,其中包括QuickCheck與hspec和HUnit一起使用來測試命令行程序的一些示例。

1

我們使用FsCheck來檢查我們的OCaml到F#翻譯是否正確,並且我們的優化版本與未優化版本的工作方式相同。由於NHol項目使用了一個parser組合器,因此我還計劃使用它來測試詞法分析器和分析器。

我們還有幫助功能,允許我們在NUnit(XUnit for .Net)內運行測試。見assertProp

0

這不是我的項目,但containers軟件包使用QuickCheck相當廣泛。就我個人而言,我試圖用它來比較我寫給arithmoi中的一個愚蠢的小素篩,這使我發現在arithmoi中有一個有時會出現段錯誤。

相關問題