作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最初尝试创建一个固定前 5 个元素的生成器(并且在使用 Prop.forAll
的任何测试中,前五个总是会运行),但失败了。
现在我试图通过一个范围内的随机数据生成器和一个非随机数据的生成器(即固定序列)来简化这一点。它类似于 Gen.constant
,除了它不是一个值,而是一个值序列。
我有这个(简化的可重现示例,适用于 NUnit 和 xUnit):
[<Property(Verbose = true, MaxTest=5)>]
static member MultiplyIdentityCornerCases () =
Gen.elements [0L; -1L; 1L; Int64.MinValue; Int64.MaxValue]
|> Arb.fromGen
|> Prop.forAll <| fun x -> x = x * 1L
null
来自哪里):
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
Gen.oneof
,所以每一个都会产生大约一半的值。
Gen.elements
应该从提供的序列中的所有值中统一选择,因此它将使用例如
0L
20% 的时间,但仅适用于
Gen.oneof
时的那一半用途
Gen.elements
.
0L
值,10
Int64.MinValue
值等等。这通常应该足够好了。
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
[<Theory>]
定义参数化测试。功能,并将您关心的五个极端情况提供给它。当您运行测试时,测试运行器将运行这五个测试用例。
MultiplyIdentityCornerCasesProperty
因为它是用
[<Property>]
注释的,并且该函数只是调用另一个函数。
关于random - 如何为 FsCheck 创建具有固定项目列表的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41065300/
我是一名优秀的程序员,十分优秀!