簡體   English   中英

FsCheck 與 C# 中的 NUnit 集成

[英]FsCheck integration with NUnit in C#

TL;DR:我無法在 C# 中成功地將 FsCheck 與 NUnit 一起使用:要么:

  • 它在標准輸出上告訴我測試失敗,但測試仍然顯示為綠色
  • 它告訴我它沒有找到任何要運行的測試
  • 或者我不明白如何在 C# 中應用我閱讀的文檔

我認為一個虛擬但完整的例子會有所幫助......


(更多詳情)

第一步:測試保持綠色

我安裝了 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 包fscheckfscheck.nunit (除了我的.NET Core 3.1測試項目中的NUnit3TestAdapterMicrosoft.NET.Test.Sdk )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM