如何在F#中处理单元测试?

时间:2009-09-23 22:03:52

标签: unit-testing f#

如何在F#中创建单元测试?我通常使用Visual Studio的UnitTest部分和[TestClass]和[TestMethod]属性,并使用测试视图来运行它们。我知道我可以创建一个脚本文件并运行它们,但我喜欢它当前处理的方式。

7 个答案:

答案 0 :(得分:11)

结帐fscheck。它是Haskell Quickcheck的一个端口。 Fscheck允许您指定函数必须满足的属性,然后它将根据“大量随机生成的案例”进行验证。

这是你用C#等命令式语言无法轻易做到的事情。

答案 1 :(得分:10)

我宁愿使用FsUnitFsTest在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.netTestDriven.Net(Visual Studio加载项用于运行测试,免费为“学生,开源开发人员和试用用户”)和我自己的开源{{{ 3}}库(也适用于NUnit和任何其他基于异常的断言框架)。这已经很好了,开始很容易:

  1. 下载并安装TestDriven.Net
  2. 下载xUnit.net,解压缩到任意位置并运行xunit.installer.exe以与TestDriven.Net集成
  3. 下载Unquote,解压缩到任何位置
  4. 在您的解决方案中创建单元测试项目
  5. 在单元测试项目中添加对xunit.dll和Unquote.dll的引用(来自解压缩的下载)
  6. 以下是包含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]
    
  7. 右键单击解决方案资源管理器中的项目并选择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)

尝试XUnit.net

答案 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帖子的一部分可能不正确或至少具有误导性。