Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 如何创建具有固定项目列表的生成器以供FsCheck_Random_F#_Fscheck - Fatal编程技术网

Random 如何创建具有固定项目列表的生成器以供FsCheck

Random 如何创建具有固定项目列表的生成器以供FsCheck,random,f#,fscheck,Random,F#,Fscheck,我最初试图创建一个固定了前5个元素的生成器(并且在任何使用Prop.forAll的测试中,前5个元素始终会运行),但失败了 现在,我试图通过一个生成器来简化这个过程,一个生成器用于范围内的随机数据,另一个生成器用于非随机数据,即固定序列。它类似于Gen.constant,只是它不是一个值,而是一个值序列 我有一个(简化的可复制示例,与NUnit和xUnit一起使用): 我希望输出包含序列中的所有五个测试,最好,但不一定,按顺序。我知道我可以使用testdata提供程序使用NUnit(或任何单元测

我最初试图创建一个固定了前5个元素的生成器(并且在任何使用
Prop.forAll
的测试中,前5个元素始终会运行),但失败了

现在,我试图通过一个生成器来简化这个过程,一个生成器用于范围内的随机数据,另一个生成器用于非随机数据,即固定序列。它类似于
Gen.constant
,只是它不是一个值,而是一个值序列

我有一个(简化的可复制示例,与NUnit和xUnit一起使用):

我希望输出包含序列中的所有五个测试,最好,但不一定,按顺序。我知道我可以使用testdata提供程序使用NUnit(或任何单元测试系统)来实现这一点,但我想知道我是否可以使用FsCheck来实现这一点(或者我是否应该这样做,也许这是个坏主意)


我认为使用FsCheck是有用的,对于有多个函数参数的情况,我希望它能够彻底地测试我给它的所有角案例参数的组合。希望使用FsCheck比使用testdata提供程序更容易做到这一点。

我不知道这是可能的,但您可以这样做:

open System
open FsCheck
open FsCheck.Xunit

[<Property>]
let MultiplyIdentityCornerCases () =
    Gen.oneof [
        Gen.elements [Int64.MinValue; -1L; 0L; 1L; Int64.MaxValue]
        Arb.generate ]
    |> Arb.fromGen
    |> Prop.forAll <| fun x -> x = x * 1L
在这里,您使用xUnit.net的
[]
特性定义了一个参数化测试,并将您关心的五个关键案例提供给它。运行测试时,测试运行程序将运行这五个测试用例


此外,它将运行
MultiplyIdentityCornerCasesProperty
,因为它用
[]
注释,并且该函数只调用另一个函数。

大声思考,解决这个问题的一种方法可能是使用数字生成器的非随机性(或者检查它是如何实现的),对于整数,它似乎完全按照我需要的方式工作(请参阅我的FsCheck输出),我最喜欢第二个代码段。实际上很整洁。再次谢谢你,马克。我喜欢第二种方法,前提是我可以为数据提供者替换静态数据,但这应该不是问题。现在,我使用了上面第一种方法的一种变体,它在实践中似乎工作得很好(并确保运行足够的测试,以确定所有可能性)。
0:
<null>
9223372036854775807L
1:
<null>
-9223372036854775807L
2:
<null>
-9223372036854775807L
3:
<null>
1L
4:
<null>
-9223372036854775807L
Ok, passed 5 tests.
open System
open FsCheck
open FsCheck.Xunit

[<Property>]
let MultiplyIdentityCornerCases () =
    Gen.oneof [
        Gen.elements [Int64.MinValue; -1L; 0L; 1L; Int64.MaxValue]
        Arb.generate ]
    |> Arb.fromGen
    |> Prop.forAll <| fun x -> x = x * 1L
open System
open Xunit
open FsCheck
open FsCheck.Xunit
open Swensen.Unquote

[<Theory>]
[<InlineData(Int64.MinValue)>]
[<InlineData(-1L)>]
[<InlineData( 0L)>]
[<InlineData( 1L)>]
[<InlineData(Int64.MaxValue)>]
let MultiplyIdentityCornerCases x = x =! x * 1L

[<Property>]
let MultiplyIdentityCornerCasesProperty x =
    MultiplyIdentityCornerCases x