F#的开发和单元测试?F#的开发和单元测试?(F# development and unit tes

2019-05-13 02:26发布

我刚刚开始使用F#,这是我的第一个功能性的语言。 我一直在工作的准专门与C#和F#如何使我重新思考我如何写代码享受了一番。 一方面我觉得有点迷惑是在编写代码的过程中变化。 我一直在使用TDD多年在C#中,现在,真的很感谢有单元测试就知道我在哪里。

到目前为止,我用F#过程中一直写一些功能,和他们一起玩与交互式控制台,直到我在“合理”确保他们的工作,并调整与合并。 这非常像欧拉项目规模小的问题,但我无法想象建设事大呀。

人们如何接近单元测试和构建测试套件的F#程序? 是否有一个相当于TDD? 任何指针或想法赞赏。

Answer 1:

测试驱动的开发人员应该觉得函数式语言如F#宾至如归:小功能,让确定性重复的结果借给自己完美的单元测试。 也有在F#语言功能,便于编写测试。 举个例子来说, 对象表达式 。 你可以很容易写的是取作为其输入接口类型功能假货。

如果有的话,F#是一流的面向对象的语言,你可以使用在C#进行TDD时,使用相同的工具和技巧。 也有写的,或是专门用于F#的一些测试工具:

  • NaturalSpec
  • FsCheck
  • FsTest
  • FsUnit

马修Podwysocki写了一个伟大的一系列关于函数式语言的单元测试。 Bob大叔还写了一个发人深省的文章在这里 。



Answer 2:

我使用NUnit,它不罢工我难以阅读或繁重的写:

open NUnit.Framework

[<TestFixture>]
type myFixture() = class

    [<Test>]
    member self.myTest() =
       //test code

end

由于我的代码是F#和其它.NET语言的混合,我喜欢的是我写的单元测试基本相同的方式,并在这两个F#和C#类似的语法。



Answer 3:

看一看FsCheck,F#的自动测试工具,基本上是Haskell的快速检查的端口。 它允许提供该程序的说明书中,该功能或方法应满足属性的形式,和FsCheck测试该性能在大量的随机生成的情况下成立。

FsCheck CodePlex上页

FsCheck作者页



Answer 4:

作为dglaubman建议你可以使用NUnit。 xUnit.net也提供了支持,这和使用效果很好TestDriven.net 。 的代码类似于NUnit的测试,但不要求以包裹试验中包含类型。

#light

// Supply a module name here not a combination of module and namespace, otherwise
// F# cannot resolve individual tests nfrom the UI.
module NBody.DomainModel.FSharp.Tests

open System
open Xunit

open Internal

[<Fact>]
let CreateOctantBoundaryReordersMinMax() =
    let Max = VectorFloat(1.0, 1.0, 1.0)
    let Min = VectorFloat(-1.0, -1.0, -1.0)

    let result = OctantBoundary.create Min Max

    Assert.Equal(Min, result.Min)     
    Assert.Equal(Max, result.Max) 


Answer 5:

我觉得这是我想了很多自己是一个很有趣的问题。 我的想法至今都只是想法,所以带他们到底是什么。

我认为,一个自动化测试套件的安全网是太宝贵的资产放手,但诱人的交互式控制台的可能,所以我打算继续编写单元测试,因为我一直在做的。

一个.NET的主要优势之一是跨语言的能力。 我知道我会尽快写F#的生产代码,但我的计划是编写单元测试在C#我的方式缓解到什么对我来说是一个新的语言。 就这样,我也得来测试什么,我F中写#将与C#(和其他.NET语言)兼容。

通过这种方法,据我所知,有F#,我只能在我的F#代码在内部使用,但不能暴露我的公共API的一部分的某些特征,但我会接受这一点,就像我今天接受,有一些事情C#允许我表达(如uint )是不符合CLS,所以我避免使用核武器。



Answer 6:

你可以看看FSUnit -虽然我还没有使用它,它可能值得一试。 当然,不是在F#中使用例如(本机)NUnit的更好。



Answer 7:

尽管是有点迟到了,我想欢迎马蒂亚斯到F#(迟到总比不到好;))和帮腔,你可能会喜欢Expecto

Expecto有一些你可能会喜欢的功能:

  • F#的语法贯穿始终,测试,价值观​​; 写简单的F#生成测试
  • 使用内置的期待模块,或外部LIB像引文结束的断言
  • 并行测试默认
  • 测试你的Hopac代码或您的异步代码; Expecto在整个异步
  • 可插拔记录和经由Logary门面度量; 轻松地编写适配器构建系统,或者使用定时机制,建立你的测试的执行时间的InfluxDB + Grafana仪表板
  • 内置支持BenchmarkDotNet
  • 建立在FsCheck支持; 可以很容易地建立与生成/随机数据或建立你的对象/演员的状态空间不变的模型试验

-

open Expecto

let tests =
  test "A simple test" {
    let subject = "Hello World"
    Expect.equal subject "Hello World" "The strings should equal"
  }

[<EntryPoint>]
let main args =
  runTestsWithArgs defaultConfig args tests

https://github.com/haf/expecto/



文章来源: F# development and unit testing?