使用C#使用FsCheck生成随机字符串

gss*_*der 3 c# testing f# fscheck

我想逐步将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;
}
Run Code Online (Sandbox Code Playgroud)

如果我多次调用它,我每次都会得到相同的字符串.

如何每次获取不同的字符串和/或正确编写此代码?

Kur*_*out 6

您应该使用属性替换测试,而不是尝试生成随机字符串,然后手动使用测试中的字符串.FsCheck不适合将其用作随机生成器,尽管可以将其强制转换为随机生成器.就像是:

var maxLength = 10
return Arb.Generate<string>().Sample(maxLength, 1).Single()
Run Code Online (Sandbox Code Playgroud)

应该生成一个新的随机字符串,长度最多为10",大部分时间",即如果我没记错的话,随机种子是基于时间的.因此,如果您在同一时间间隔内调用它两次,它将返回相同的字符串.

这样做不会让你利用缩小和API Prop来观察和分类生成的数据,例如限制它:https://fscheck.github.io/FsCheck/Properties.html

  • 顺便说一句,您应该能够在同一个项目中混合使用。我一直这样做。例如,对于特定的错误重现,如果我单独添加带有失败示例的特定测试,我会感到更安全,即使该反例是首先通过基于属性的测试找到的。 (2认同)