2016-01-07 14 views
6

我是單元測試的n00b。我已經安裝的NuGet FsCheck.NunitNUnitTestAdapter,我試圖做基於屬性的測試,通過the inestimable Scott Wlaschin很大程度上啓發。如果隨機生成的輸入無用,我該如何重新嘗試基於屬性的測試?

我現在用的是[<Property>]屬性,我想「跳過」輸入不符合測試的要求的能力:

[<Property(MaxTest=10)>] 
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest = 
    if Directory.Exists(badDest) 
    then // somehow skip to the next randomized input 
    else // do the actual test 

什麼是最簡單的方法是什麼?

我更喜歡FsCheck/NUnit的答案(如果存在的話),但我也會考慮其他任何可以在Visual Studio中運行測試的框架。 (我以爲我看到一些框架,其中有一個簡單的功能來做到這一點,但我不知道它是什麼)

我更喜歡FsCheck.NUnit,因爲它可以爲F#生成隨機輸入,類型(歧視工會等),無需額外的工作。

+0

您需要一個自定義生成器。 –

+0

IIRC對於then語句,只需返回說明測試成功的結果而不運行測試。像「真」這樣簡單的東西可能會起作用。這幾年我遇到了問題,並且問題已經在解決問題。記住這個測試只是一個功能,而測試驅動程序只是想要一個表明成功或失敗的結果,以便讓它取得成功。 –

+0

@Guy Coder問題是我想讓測試重新運行不同的隨機輸入,如果生成的沒有用處 - 我不希望函數多次運行不合適的輸入並聲明自己成功它從未真正進行過測試。 –

回答

6

你應該能夠做這樣的事情:

open FsCheck 
open FsCheck.Xunit 

[<Property(MaxTest=10)>] 
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest = 
    (not Directory.Exists(badDest)) ==> lazy 
    // do the actual test 

第一行是一個布爾條件,並==>是由FsCheck模塊定義的自定義操作。如果右邊的條件評估爲true,它只會強制評估懶惰表達式。然而

不要考慮,重構這個測試,以便它不依賴於文件系統上。文件系統是永久性的,所以會自動創建一個持久性燈具,即a lot of trouble to manage;不是不可能處理,但更好地避免。

本例使用FsCheck.Xunit,但IIRC FsCheck.Nunit的工作方式相同。你應該認真考慮使用FsCheck.Xunit而不是FsCheck.Nunit,雖然。 NUnit 2的可擴展性模型非常差,這意味着大多數試圖擴展NUnit的Glue Libraries會帶來很多問題。這是不是與FsCheck.Nunit一個問題,但與NUnit的本身,但它會在許多爲你帶來麻煩顯現出來。

+0

太棒了,那正是我在找的東西。我可能首先在你的博客上看到它。感謝NUnit vs Xunit的提示。 –

+0

通常我會盡量保持獨立於文件系統,數據庫狀態等的測試,但對於我在這裏開發的函數來說,操縱文件系統是他們的主要目的。我還能怎樣測試它們呢? –

+0

@OverlordZurg也許這個答案回答了這個問題:http://codereview.stackexchange.com/a/99290/3878 ...或者它可能不是:) –

0

我對F#或fscheck並不熟悉,但NUnit提供了Assert.Ignore()函數,它會立即停止測試並將其標記爲「忽略」。如果您覺得這些是更合適的狀態,您也可以使用Assert.Inconclusive()Assert.Pass()

+0

我嘗試了「Assert.Ignore()」,但這會導致標有[]屬性的測試失敗,這不是我想要的行爲。 –

1

FsCheck.Prop.discard()似乎做我想要的東西 - 當我運行日誌記錄的測試,我可以看到一些嘗試被丟棄,但10次不被丟棄已經完成。

==>操作員用於運行FsCheck.Quick或類似的測試。然而,這要求懶惰部分採用「可測試」的格式,其中我目前正在撰寫的測試僅僅是<inputs>->unit

+1

*「,這需要懶部分的格式爲'可測試'*這不應該是一個問題。編譯器會爲你推斷適當的類型。請參閱此處的示例:http://blog.ploeh.dk/2015/09/08/ad-hoc-arbitraries-with-fscheckxunit –

+2

在您的'then'分支中調用'discard',或者使用'== >應該完全等同。雖然'==>'是首選方法 - 它通過在引擎蓋下拋出和捕獲異常來讀取更好的imo和'discard'作品,因此調試速度可能會很慢並且具有破壞性。 –

+0

發現問題 - 我試圖返回單元,但我需要返回布爾。不幸的是,從懶惰部分(而不是Assert.AreEqual())返回bool使我失去了明確聲明期望值與實際值的良好格式。我正在繼續探索選項,但至少現在我明白了:) –

相關問題