- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 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
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 = Arb.generate<Space list> |> Arb.fromGen
// Test
Prop.forAll pieces <| fun piece ->
Prop.forAll positionsList <| fun positionsItem ->
positionsItem |> optionsFor piece
|> List.length <= 2
[<Property(QuietOnSuccess = true, MaxTest=100)>]
let ``options for soldier can never exceed 2`` () =
// Setup
let pieceGen = Arb.generate<Piece> |> Gen.filter (isKing >> not)
let positionsGen = Arb.generate<Space list>
// Test
(pieceGen , positionsGen) ||> Gen.map2 (fun x y -> x,y)
|> Arb.fromGen
|> Prop.forAll <| fun (piece , positions) ->
positions |> optionsFor piece
|> List.length <= 2
最佳答案
作为一般观察,Arbitrary
值很难组合,而 Gen
值很容易。出于这个原因,我倾向于根据 Gen<'a>
来定义我的 FsCheck 构建块。而不是 Arbitrary<'a>
.
与 Gen
值,您可以使用 Gen.map2
组合多个参数, Gen.map3
等,或者您可以使用 gen
计算表达式。
Gen 积木
在 OP 示例中,而不是定义 pieces
和 positionsList
如 Arbitrary
,将它们定义为 Gen
值(value)观:
let genPieces = Arb.generate<Piece> |> Gen.filter (isKing >> not)
let genPositionsList = Arb.generate<Space list>
Gen<Piece>
和
Gen<Space list>
, 分别。
genPieces
而不是简单的
pieces
, 等等。这可以防止以后发生名称冲突(见下文)。 (另外,我不确定在
pieces
中使用复数 s,因为
genPieces
只生成一个
Piece
值,但我因为我不知道你的整个域,我决定离开那个照原样。)
Arbitrary
使用
Arb.fromGen
.
Gen
元组,然后您可以使用
Arb.fromGen
将其转换为
Arbitrary
.
pieces
和
positionsList
进入参数列表,你可以使用
Gen.map2
:
Gen.map2 (fun x y -> x, y) genPieces genPositionList
|> Arb.fromGen
|> Prop.forAll <| fun (pieces, positionList) ->
// test goes here...
Gen.map2 (fun x y -> x, y)
返回一个二元素元组(一对)值,您可以将其解构为
(pieces, positionList)
在匿名函数中。
genPieces
和
genPositionList
是
Gen
更好的名字值:它们留有使用“裸”名称的空间
pieces
和
positionList
对于传递给测试主体的生成值。
gen
计算表达式。
gen {
let! pieces = genPieces
let! positionList = genPositionList
return pieces, positionList }
|> Arb.fromGen
|> Prop.forAll <| fun (pieces, positionList) ->
// test goes here...
gen
表达式也返回一对,所以它等价于组合
Gen.map2
.
Gen
我文章中的组合
Roman numerals via property-based TDD .
关于f# - 如何使用 FsCheck 实现多参数生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839721/
我有以下代码: var gen = from x in Arb.Generate() from int y in Gen.Choose(5, 10) where x > 5 select new tu
总结 是否有任何事件可以在每个属性案例之前运行,以便我可以为属性的每次运行运行设置和拆卸? 完整版 我希望能够使用属性测试配对行为,例如“我总是可以获取书面记录”或“readAllLines 的输出等
我的代码在使用 FsCheck 时会自动测试从 -99 到 99 的值。 Check.Quick test 我的测试函数采用整数值。 我想使用 1 到 4999 之间的值进行测试。 最佳答案 您可以使
FsCheck 有一些简洁的默认值 Arbitrary类型来生成测试数据。但是,如果我的一个考试日期取决于另一个考试日期怎么办? 例如,考虑 string.Substring() 的属性结果子字符串永
我似乎经常遇到这样的情况,我想生成一些复杂的结构,但生成的成员类型的特殊变体却不同。 例如,考虑这棵树 type Tree = | LeafNode of 'LeafData | In
我有一个 FsCheck题: 我有以下记录类型(我事先说过,有人告诉我我的单例 DU 可能有点矫枉过正,但我发现它们描述了域,因此是必要的,除非必须,否则我不会删除它们): type Name =
我有一个函数可以在一个范围内生成 double : let gen_doublein = fun mx mn -> Arb.generate |> Gen.suchThat ( (>) mx
我最初尝试创建一个固定前 5 个元素的生成器(并且在使用 Prop.forAll 的任何测试中,前五个总是会运行),但失败了。 现在我试图通过一个范围内的随机数据生成器和一个非随机数据的生成器(即固定
有没有办法通过从每个字符串列表中只选择一个项目然后连接结果来在 FsCheck 中生成一个字符串? 我只是完全卡住了,似乎无法弄清楚。我看过 docs并在 github repo 类似的东西。我从 F
我正在尝试对此功能进行测试 let extract_one_rule (rule:Rule.t) = let rec expand = function |PAlt (a,b)
我想使用 FsCheck(与 XUnit)创建类型的记录:type QueryRequest = {Symbol: string; StartDate: DateTime; EndDate: Date
我设法得到xUnit处理我的小样本组装。现在我想看看我能不能摸索FsCheck也。我的问题是在为我的函数定义测试属性时我很困惑。 也许我只是没有一个好的函数样本集,但是例如,这些函数的好的测试属性是什
是否可以使用 fscheck 生成数据,特别是列表,以便在 fscheck 之外使用?我无法在 fscheck 测试中调试比较结果看起来相等的情况,但 fscheck 说它们不相等。 我有这个对象列表
我正在 VisualStudio 中使用 FsCheck 和 NUnit 进行测试。 当前的问题是:我设法生成随机图(用于测试某些图功能),但是当测试失败时,FsCheck 会吐出整个图,并且它不使用
我想测试一个属性,我使用 2 个概率 p1 和 p2 必须满足 0 ) = (p1 0.0 && p1 0.0 && p2 0) ==> (lazy ( let bf1
我使用 FsCheck 进行基于属性的测试,因此我为自定义类型定义了一组生成器。有些类型由其他类型组成,并且所有类型都有生成器。为字母数字类型定义了一个生成器后,我想为 RelativeUrl 类型定
我正在编写一个 FSCheck 生成器来创建具有以下属性的字符串: 它们是非空的 修剪它们不会影响长度 它们不包含空格。 这是我的生成器代码: namespace Example open FsChe
如何使用 FsCheck 实现多参数生成? 我实现了以下内容以支持多参数生成: // Setup let pieces = Arb.generate |> Gen.filter (isKing
我有这样的递归类型: type QueryInfo = { Title : string Check : Client -> bool Positive :
我正在尝试采用 fscheck,但由于没有太多 C# 文档,所以遇到了很多困难。您能解释一下,为什么以下使用 When 组合器的示例会失败(显然,我不明白如何正确使用它)? [Test] p
我是一名优秀的程序员,十分优秀!