我有一个深层嵌套的数据结构,到处都有浮点数.我正在使用FsCheck检查序列化然后反序列化后数据是否未更改.
当float为NaN或+/-无穷大时,此属性失败,但是,这种情况对我不感兴趣,因为我不希望这些值出现在实际数据中.
有没有办法防止FsCheck产生NaN和无穷大?
我已经尝试丢弃包含所述值的生成数据,但是这使得测试非常慢,实际上很慢,在我写这篇文章时测试仍在运行,我怀疑它实际上会完成...
我的代码在使用FsCheck时自动测试-99到99之间的值.
Check.Quick test
我的测试函数采用整数值.
我想测试使用1到4999之间的值.
我想逐步将FsCheck集成到我的C#测试代码中(作为第一步).
我想随机生成部分输入数据.
这是我生成随机字符串的方式:
static string RandomString() {
  var kgen = Gen.Constant(Gen.Sized(g => Gen.OneOf(Arb.Generate())));
  var sgen = Gen.Sample(1, 10, kgen).First();
  var str = Gen.Eval(10, Random.StdGen.NewStdGen(0, 1000), sgen);
  return str;
}
如果我多次调用它,我每次都会得到相同的字符串.
如何每次获取不同的字符串和/或正确编写此代码?
假设我有一个带有2个读取属性age(int)和name(string)的接口IPerson.
我还有一个实施IPerson的人员.
如何编写用于生成IPerson类型实例的FsCheck生成器?
如何使用FsCheck实现多个参数生成?
我实现了以下内容以支持多个参数生成:
// Setup
let pieces =    Arb.generate<Piece> |> Gen.filter (isKing >> not)
                                    |> Arb.fromGen  
let positionsList = Arb.generate<Space list> |> Arb.fromGen
然后我使用这些参数来测试一个函数的行为,该函数负责为给定的检查器生成移动选项:
// Test
Prop.forAll pieces <| fun piece ->
    Prop.forAll positionsList <| fun positionsItem ->
        positionsItem |> optionsFor piece 
                      |> List.length <= 2
在管理多个生成的参数类型时,是否将Prop.forAll表达式嵌套为正确的技术?
是否有替代方法为被测函数生成多个参数?
这是整个功能:
open FsCheck
open FsCheck.Xunit
[<Property(QuietOnSuccess = true)>]
let ``options for soldier can never exceed 2`` () =
    // Setup
    let pieces =    Arb.generate<Piece> |> Gen.filter (isKing >> not)
                                        |> Arb.fromGen  
    let positionsList …编译器接受以下行:
input |> Prop.forAll <| fun (a , b) -> add a b = add b a
但是,当我用括号替换向后pipline运算符时,我收到一个错误:
input |> Prop.forAll ( fun (a , b) -> add a b = add b a )
类型不匹配.期待任意 - >'a但给定a('b - >'c) - >属性"任意"类型与"a - >"b类型不匹配
我不太清楚这个错误意味着什么.为什么向后管道操作符编译但括号不编译?
附录:
module Arithmetic
let add a b =
    a + b
open FsCheck
open FsCheck.Xunit
[<Property(MaxTest=1000, QuietOnSuccess=true)>]
let ``'a + 'b equals 'b + 'a`` () =
    // Declare generators per type required for function …我有一个函数,应该得到两个实际参数进行测试.这两个值都应该由任意实例创建,因为它们需要具有一些不能完全随意的良好形式.
所以我创建了以下代码         
let updating (x:SomeType) (y:SomeOtherType) =
    let result = update x y
    result.someProp = x.someProp
    && result.otherProp = y.otherProp
let arbSomeType = 
    Arb.generate<SomeType> 
        |> Gen.filter fun x -> x.checkSomeStuff
        |> Arb.fromGen
let arbSomeType = 
    Arb.generate<SomeOtherType> 
        |> Gen.filter fun x -> x.checkPropertiesOfThis
        |> Arb.fromGen
但是,我现在如何组合这两个任意实例,以便它们与测试方法的签名相匹配?
//let prop = Prop.forAll arbSomeType + arbSomeType updating
Check.QuickThrowOnFailure prop
我正在编写FSCheck生成器来创建具有以下属性的字符串:
这是我的生成器代码:
namespace Example
open FsCheck.Arb
module public Generation = 
    let hasChars (s : string) =
        (isNull s |> not)
        && s.Length > 0
    let isTrimmed (s : string) =
        s.Trim().Length = s.Length
    let isContinuous (s : string) =
        s
        |> Seq.exists ((=) ' ')
        |> not
    [<AbstractClass; Sealed>]
    type public Generators = class end
    type public ContinuousString = ContinuousString of string with
        member x.Get = match x with ContinuousString r -> r
        override x.ToString() = x.Get …是否可以使用fscheck生成数据,特别是列表,以便在fscheck之外使用?我无法调试fscheck测试中的情况,看起来比较结果是相同的,但fscheck说它们不是.
我有这个生成器用于对象列表.如何生成可以从此生成器使用的列表?
let genListObj min max  = Gen.listOf Arb.generate<obj> |> Gen.suchThat (fun l -> (l.Length >= min) && (l.Length <= max))
以下测试失败:
open FsCheck
open FsCheck.NUnit
open NUnit.Framework
let ``Property: double negation equals no negation`` list =
    list = List.rev (List.rev list)
[<Test>]
let ``reversing list two times is equal to not reversing list at all`` list = 
    Check.Quick ``Property: double negation equals no negation``
错误:
消息:未提供任何参数
我认为FsCheck会在每次测试迭代时为我提供论据.
我正在引用以下文档.