[英]FsCheck integration with NUnit in C#
TL;DR:我無法在 C# 中成功地將 FsCheck 與 NUnit 一起使用:要么:
我認為一個虛擬但完整的例子會有所幫助......
(更多詳情)
第一步:測試保持綠色
我安裝了 Nuget 包FsCheck.NUnit
(2.10.4),天真地嘗試了:
[NUnit.Framework.Test]
public void SomeTest()
{
// Note the subtle bug: I Reverse only once, because I want the test to fail
Func<int[],bool> revRevIsOrig = xs => xs.Reverse().SequenceEqual( xs );
Prop.ForAll(revRevIsOrig).QuickCheck();
}
當我像運行任何 NUnit 測試一樣運行它時,它最終變成綠色,即使我在標准輸出上看到
Falsifiable, after 3 tests (1 shrink) (StdGen (2129798881,296376481)):
Original:
[|-1; 0|]
Shrunk:
[|1; 0|]
第二步:測試不確定
所以我繼續,找到了一些doc ,並注意到我應該使用Property
而不是Test
。 所以我改變了我的代碼
[FsCheck.NUnit.Property] // <-- the line that changed
public void SomeTest()
{
Func<int[],bool> revRevIsOrig = xs => xs.Reverse().SequenceEqual( xs );
Prop.ForAll(revRevIsOrig).QuickCheck();
}
我從 Visual 啟動了測試, inconclusive
狀態為inconclusive
。 一些日志告訴我:
無法運行測試:在“xxx.exe”中找不到合適的測試。 要么程序集不包含測試,要么未找到合適的測試驅動程序
第三步:我注意到我沒有理解文檔
當我重新閱讀文檔時,我注意到它說我的測試方法可以接受參數並且應該返回一個屬性。 我顯然沒有這樣做,因為我什么都不回。
可悲的是,我不明白我實際上應該做什么(而且我對 F# 不夠熟悉,無法理解下面的示例......)......(我盲目地嘗試了一些隨機的東西看起來他們是有道理的,但我從來沒有以紅色測試結束)
我真的很感激任何能幫助我讓這個測試變紅的指針!
嘗試使用QuickCheckThrowOnFailure
函數
QuickThrowOnFailure
確保如果測試失敗,則會引發包含必要信息的異常,以便運行者知道測試失敗。
[Test]
public void SomeTest() {
// Note the subtle bug: I Reverse only once, because I want the test to fail
Func<int[],bool> revRevIsOrig = xs => xs.Reverse().SequenceEqual( xs );
Prop.ForAll(revRevIsOrig).QuickCheckThrowOnFailure();
}
將 FsCheck 與 NUnit 一起使用的另一種方法(來自 FsCheck github 示例)是
[FsCheck.NUnit.Property(Verbose = true)]
public void SomeTest()
{
Func<int[],bool> revRevIsOrig = xs => xs.Reverse().SequenceEqual( xs );
return Prop.ForAll(revRevIsOrig);
}
但是這種方式不會向您報告測試失敗的原因。 所以現在 Nkosi 的回答更好,但我認為它總有一天會得到解決。
除了其他提到的選項之外,您還可以通過使用Property
屬性和正確的返回類型(為了清晰起見,我已經包含了名稱空間)將此測試轉換為基於屬性的測試。
注意.ToProperty
調用將其轉換為Property
。
[FsCheck.NUnit.Property]
public FsCheck.Property RevRev_IsOriginal(int[] xs)
{
Func<bool> revRevIsOrig = () => xs.Reverse().Reverse().SequenceEqual(xs);
return revRevIsOrig.ToProperty();
}
框架將通過int[] xs
方法參數生成測試數據。
這需要nuget 包fscheck
和fscheck.nunit
(除了我的.NET Core 3.1
測試項目中的NUnit3TestAdapter
和Microsoft.NET.Test.Sdk
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.