FsCheck与C#中的NUnit集成

gtu*_*rri 3 c# nunit unit-testing fscheck

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();
}
Run Code Online (Sandbox Code Playgroud)

当我像运行任何NUnit测试一样运行它时,它最终显示为绿色,即使我在stdout上看到

Falsifiable, after 3 tests (1 shrink) (StdGen (2129798881,296376481)):
Original:
[|-1; 0|]
Shrunk:
[|1; 0|]
Run Code Online (Sandbox Code Playgroud)

第二步:测试不确定

所以我继续,找到了一些文档,并注意到我应该使用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();
}
Run Code Online (Sandbox Code Playgroud)

我从Visual启动了测试,最终状态为inconclusive。一些日志告诉我:

无法运行测试:在“ xxx.exe”中找不到合适的测试。程序集不包含任何测试或找不到正确的测试驱动程序

第三步:我发现我不了解该文档

当我重新阅读文档时,我注意到它说我的测试方法可以带参数,并且应该返回一个属性。我显然什么也没做,因为我什么也没退。

可悲的是,我不了解我实际上应该做的事情(而且我对F#不够了解,无法理解下面的示例...)...(我盲目地尝试了一些随机的东西,看起来它们是有道理的,但我从未以红色测试告终)

我真的很感谢有任何指针可以帮助我使这项测试变红!

Nko*_*osi 5

尝试使用该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();
}
Run Code Online (Sandbox Code Playgroud)