Quickcheck及其變體(即使在Java中有一個),似乎很有趣。然而,除了學術興趣之外,它在真正的應用程序測試(例如,GUI應用程序或客戶端/服務器,甚至是StackOverflow本身)中真的有用嗎?你有類似的測試發生器的任何經驗值得讚賞。您是否在實際項目中使用了Quickcheck
回答
是的,好吧。其實不是,但我已經研究過最初開發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%。
我已經用了很多,主要是以直接的方式,主要用於測試協議和解析器的實現。
然而,這裏是從我個人的經驗較少的瑣碎位:http://www.haskell.org/haskellwiki/QuickCheck_as_a_test_set_generator
我用快速檢查了很多個人的東西。在過去六個月內:
Ran QuickCheck在圖像壓縮器中測試顏色變換和離散餘弦變換。
Ran QuickCheck測試一個符號分化模塊,我爲了一些數值優化而進行了測試。
Ran QuickCheck測試Bentley和Sedgewick風格的三元搜索樹。
快速檢查很少符合所有我的單元測試的需求,但它是開始的好方法---和快速檢查法做出良好的文檔。
ScalaCheck(用於Scala的QuickCheck)用於測試Functional Java,這是一個庫,其中包含實現a QuickCheck for Java的庫。
我做了一個真正的Haskell問題,其中涉及到離散事件模擬。於是我寫了一個基於繼續monad的DES庫,以及MVars和Channels的等價物。我需要檢查這個工作是否正常,所以我編寫了一堆QuickCheck屬性來演示,例如,寫入通道的兩個併發數據流將被正確合併而不會丟失任何內容。
我也用QuickCheck來記錄和驗證我的Ranged Sets和Decimal庫中的屬性。
根據我的經驗,QuickCheck有時很棒。如果您能夠以簡潔的方式總結一個重要的屬性,雖然提供該屬性的算法很有趣,但QuickCheck是一個巨大的勝利。另一方面,我經常發現算法等價於我想驗證的屬性。在這種情況下,我尋找更簡單的屬性。例如,假設函數「foo」應該是非嚴格單調的。然後你可以寫
prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)
我只在生產環境中使用Haskell來開發小幫助工具。主要是因爲我是唯一讀過Haskell的開發人員。儘管我廣泛使用了QuickCheck,並且非常惱火,類似的東西在C#中不可用。所以我決定嘗試和write it myself。我也看了Pex,但發現程序探索技術被用來尋找最少的輸入,而不像QuickCheck那樣有趣。
AFAIK XMonad與快速檢查
我用快速檢查測試的任何語言編寫的命令行程序的行爲廣泛的測試。
找到低級別或動態類型程序崩潰的輸入特別有用。
爲方便起見,我寫了http://hackage.haskell.org/package/proctest,其中包括QuickCheck與hspec和HUnit一起使用來測試命令行程序的一些示例。
我們使用FsCheck來檢查我們的OCaml到F#翻譯是否正確,並且我們的優化版本與未優化版本的工作方式相同。由於NHol項目使用了一個parser組合器,因此我還計劃使用它來測試詞法分析器和分析器。
我們還有幫助功能,允許我們在NUnit(XUnit for .Net)內運行測試。見assertProp。
我已經使用QuickCheck在LG Linux Mobile平臺上測試SMS PDU編碼器和解碼器。當時我開發的軟件的(舊)版本可以在http://hackage.haskell.org/package/GenSmsPdu-0.1下載
這不是我的項目,但containers
軟件包使用QuickCheck相當廣泛。就我個人而言,我試圖用它來比較我寫給arithmoi
中的一個愚蠢的小素篩,這使我發現在arithmoi
中有一個有時會出現段錯誤。
- 1. Maven是否用於實際項目?
- 2. GetConsumingEnumerable實際上是否從BlockingCollection中刪除了一個項目?
- 3. 在實際項目
- 4. OrientDB是否實際實現了MVCC?
- 5. NSApp隱藏了什麼:實際上是否使用NSWindow實例?
- 6. Theano在配置爲使用GPU時是否實際使用了100%的CPU?
- 7. 如何在svn的maven項目中實際使用liquibase
- 8. 在實際項目中使用的Flex視圖狀態
- 9. 在真實項目中使用requestAnimationFrame是否安全?
- 10. 在您的CakePHP項目中使用Git
- 11. 當您使用Intent.ACTION_DELETE時,如何判斷用戶是否實際卸載了應用程序?
- 12. Mono項目中是否完全實現了XmlMtomReader和XmlMtomWriter?
- 13. 發現MVC項目中是否使用了views/partials
- 14. 如何檢查mootools.js是否實際在網站中使用?
- 15. 使用quickCheck
- 16. 使用Assembly開發實際應用程序是否實用?
- 17. 確定是否在當前項目中調用了SqlDependency.Start(connectionstring)?
- 18. 當您單獨編寫項目時,您是否執行測試?
- 19. 您是否重複使用了選擇框中的值?
- 20. 是實際使用的xsi:schemaLocation?
- 21. 您是否使用iOS應用程序實現了nTier體系結構?
- 22. Eclipse Clean的Flex項目實際上做了什麼?
- 23. JSoup是否實現了這個目標?
- 24. MarkupExtension.ProvideValue - IServiceProvider實際使用了嗎?
- 25. ColdFusion ColdFire項目是否已經死了?
- 26. 是否有人在Flash Builder或Flash Professional項目中實現了TestFlight SDK?
- 27. SnappyData DDL Syntax中的EXPIRE選項是否實際刪除?
- 28. SaveChanges實際上是否調用DetectChanges?
- 29. 在QuickCheck中使用自定義生成器vs任意實例
- 30. 驗證是否使用jquery選擇了多個項目
很好說。然而,回到我的問題,我們可以在其他情況下使用它的功能可能不純(它可能只是作爲副作用)。假設一個函數將文件從一個位置複製到另一個位置。 – amit 2009-02-23 09:57:24
哦,當然,你的功能有副作用並不是真正的問題。本身存在問題,但並不妨礙您使用QuickCheck。 Ericssion測試服有副作用,你可以繞過這個方法。 – 2009-02-23 12:25:17