如何在F#中创建单元测试?我通常使用Visual Studio的UnitTest部分和[TestClass]和[TestMethod]属性,并使用测试视图来运行它们。我知道我可以创建一个脚本文件并运行它们,但我喜欢它当前处理的方式。
答案 0 :(得分:11)
结帐fscheck。它是Haskell Quickcheck的一个端口。 Fscheck允许您指定函数必须满足的属性,然后它将根据“大量随机生成的案例”进行验证。
这是你用C#等命令式语言无法轻易做到的事情。
答案 1 :(得分:10)
我宁愿使用FsUnit或FsTest在F#中编写测试,感觉比OO xUnit样式测试更自然。
EDIT 2014 :我现在认为FsUnit / FsTest主要是无用的语法糖。而“比OO更自然”并不意味着什么。几个月前,我写了关于测试here的当前想法(我建议阅读整个帖子)。
答案 2 :(得分:8)
在VS2013中,您可以使用以下内容。
open Microsoft.VisualStudio.TestTools.UnitTesting
[<TestClass>]
type testrun() =
[<TestInitialize>]
member x.setup() =
//your setup code
[<TestMethod>]
member x.yourTestName() =
//your test code
提示:如果您正在寻找UI单元测试,那么您可以将此设置与Canopy一起使用。
答案 3 :(得分:4)
我使用xUnit.net,TestDriven.Net(Visual Studio加载项用于运行测试,免费为“学生,开源开发人员和试用用户”)和我自己的开源{{{ 3}}库(也适用于NUnit和任何其他基于异常的断言框架)。这已经很好了,开始很容易:
以下是包含xUnit.net / Unquote样式单元测试的单元测试项目中.fs文件的简单示例。
module Tests
open Swensen.Unquote
open Xunit
[<Fact>]
let ``description of first unit test`` () =
test <@ (11 + 3) / 2 = String.length ("hello world".Substring(4, 5)) @>
[<Fact>]
let ``description of second unit test`` () =
let x = List.rev [1;2;3;4]
x =? [4;3;1;2]
右键单击解决方案资源管理器中的项目并选择Run Test(s),运行项目中的所有单元测试。以上两个示例测试都将失败,并在Visual Studio输出窗口中打印以下内容:
------ Test started: Assembly: Tests.dll ------
Test 'Tests.description of second unit test' failed:
[4; 3; 2; 1] = [4; 3; 1; 2]
false
C:\Solution\Project\Tests.fs(12,0): at Tests.description of second unit test()
Test 'Tests.description of first unit test' failed:
(11 + 3) / 2 = String.length ("hello world".Substring(4, 5))
14 / 2 = String.length "o wor"
7 = 5
false
C:\Solution\Project\Tests.fs(7,0): at Tests.description of first unit test()
0 passed, 2 failed, 0 skipped, took 1.09 seconds (xUnit.net 1.7.0 build 1540).
答案 4 :(得分:3)
您可能想尝试NaturalSpec。它是NUnit之上的F#UnitTest-Framework。
答案 5 :(得分:2)
答案 6 :(得分:2)
从版本2.5开始,NUnit允许您使用static members as tests。此外,类级TestFixtureAttribute是only necessary for generic or classes with non-default constructors。 NUnit还有一个backward-compatible convention,测试成员可以用“test”开头而不是使用TestAttribute,所以你几乎可以用NUnit&gt;写出惯用的F#。 2.5。
<强>更新强> 您可以在Cashel library中看到一些没有TestFixtureAttribute的测试示例。我继续使用TestAttribute,因为看起来很少有测试运行者在不存在时正确地接受测试,因此NUnit帖子的一部分可能不正确或至少具有误导性。