问题标签 [fscheck]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - 是否可以在无需将测试代码标记为内部的情况下测试内部代码?
我有一个 F# 库,里面有很多我想测试的非公开内容。目前,所有不属于程序集公共 API 的代码都被标记internal
(具体来说,它被放置在被标记的模块中internal
)。我使用InternalsVisibleToAttribute
使此代码对我的测试程序集可见。但是,为了编译测试程序集,所有在其签名中使用内部类型的测试(其中大多数,因为我使用 FsCheck 自动生成测试输入)也必须标记为内部(这需要应用于每个函数,因为 xunit 不会发现内部模块)。此外,专门用于 FsCheck 生成的任何类型(例如type ValidCustomer = ValidCustomer of Customer
,Customer
是我的内部域类型)也需要标记为内部,并且 FsCheck 在创建内部类型时似乎卡住了,因此测试不运行。
有什么方法可以测试内部 F# 代码(来自单独的测试程序集),而不必将签名依赖于内部类型的所有测试标记为内部?现在我只是倾向于在原始代码中根本不做任何内部事情,但理想情况下,有一种方法可以让我的干净 API 蛋糕也吃掉。
c# - C#、xunit、fscheck,使用自定义生成器或受约束的随机字符串编写基于属性的简单测试
我正在尝试解决菱形 kata,以便学习如何使用 fscheck 库编写基于属性的测试。我想用 C# 编写测试,我正在使用 Visual Studio 2017。
我想编写一个基于属性的测试,它不会生成任何随机字符作为输入,而只会生成字母。我不确定如何编写生成器 fscheck 需要执行此操作以及将代码放在哪个文件中?
我到处搜索并阅读文档,但遇到了麻烦(部分原因是我不能很好地将 F# 翻译成 C#)。
如何[Property]
用于将输入数据限制为仅字母?
如果有更好的方法请告诉我。
[编辑:]
我编辑了我的代码示例,现在包含 Kurt Schelfthout 的一个工作解决方案。
测试
测试类
c# - FsCheck:如何生成依赖于其他测试数据的测试数据?
FsCheck 有一些简洁的默认Arbitrary
类型来生成测试数据。但是,如果我的一个考试日期取决于另一个考试日期怎么办?
例如,考虑string.Substring()
结果子字符串永远不能长于输入字符串的属性:
虽然实现Substring
肯定是正确的,但这个属性失败了,因为最终PositiveInt
会生成比生成的更长的 a,NonEmptyString
从而导致异常。
收缩:NonEmptyString "a" PositiveInt 2 异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。
我可以与 an 进行比较,if (input.Length < length) return true;
但这样我最终会进行大量测试运行,甚至没有检查该属性。
如何告诉 FsCheck 只生成PositiveInt
不超过输入字符串的 s?我想我必须使用这个Gen<T>
类,但它的界面让我很困惑......我尝试了以下但仍然PositiveInt
s 超过了字符串:
unit-testing - F# 测试结果是否为 Some(any)
我需要检查我的验证函数是否some
在失败或none
. 如果返回Some<string>
,则存在验证错误,否则有效且函数返回None
。这是我的尝试,但重构并不安全:
f# - 自定义 FsCheck 任意类型在 Xunit 中损坏,但在 LINQPad 和常规 F# 程序中工作
我正在尝试实现一个Arbitrary
生成 glob 语法模式的自定义,例如a*c?
. 我认为我的实现是正确的,只是在使用 Xunit 运行测试时,FsCheck 似乎没有使用自定义任意Pattern
生成测试数据。但是,当我使用 LINQPad 时,一切都按预期工作。这是代码:
这是输出:
可证伪,经过 2 次测试(0 次收缩)(StdGen (1884571966,296370531)):原始:模式 null 异常:System.NullReferenceException ...
这是我在 LINQPad 中运行的代码以及输出:
可证伪,经过 1 次测试(0 次缩小)(StdGen (1148389153,296370531)):原始:模式“a*”
如您所见,尽管我使用and来控制测试数据,但 FsCheck 在 Xunit 测试中生成了一个null
值。此外,当我运行它几次时,我看到了超出指定字符范围的测试模式。在 LINQPad 中,这些模式是正确生成的。我还在 Visual Studio 2017 中使用常规 F# 控制台应用程序进行了相同的测试,并且自定义工作也按预期工作。Pattern
Gen.elements
Gen.nonEmptyListOf
Arbitrary
出了什么问题?在 Xunit 中运行时 FsCheck是否回退到默认值string
Arbitrary
?
您可以克隆此 repo 以亲自查看:https ://github.com/bert2/GlobMatcher
(我不想使用Prop.forAll
,因为每个测试都会有多个 customArbitrary
并且Prop.forAll
不适合。据我所知,我只能将它们组合起来,因为 F# 版本Prop.forAll
只接受一个Arbitrary
。)
f# - 如何将 FsCheck 生成器列表累积为单个值?
我编写了一个 FsCheck 生成器,它产生随机 glob 语法模式(例如a*c?
)以及与该模式匹配的随机字符串(例如abcd
)。但是我的解决方案使用了一个可变变量,我对此感到很惭愧。看一看:
请注意,它text
是可变的,以及它的值是如何在循环中累积的。
我的直觉告诉我,必须有一种方法可以fold
将生成器导入text
,但我不知道如何,因为我不了解let!
引擎盖下的工作原理(还)。我正在考虑类似于以下内容:
我在正确的轨道上吗?累加器和种子应该是什么fold
样的?
c# - FsCheck 与 C# 中的 NUnit 集成
TL;DR:我无法在 C# 中成功地将 FsCheck 与 NUnit 一起使用:或者:
- 它在标准输出上告诉我测试失败但测试仍然显示为绿色
- 它告诉我它没有找到要运行的任何测试
- 或者我不明白如何在 C# 中应用我阅读的文档
我认为一个虚拟但完整的例子会有所帮助......
(更多细节)
第一步:测试保持绿色
我安装了 Nuget 包FsCheck.NUnit
(2.10.4),并天真地尝试:
当我像运行任何 NUnit 测试一样运行它时,它以绿色结束,即使我在标准输出上看到
第二步:测试无定论
所以我继续,找到了一些doc,并注意到我应该使用Property
而不是Test
. 所以我将代码更改为
我从 Visual 启动了测试,结果是 status inconclusive
。一些日志告诉我:
无法运行测试:在“xxx.exe”中找不到合适的测试。任一程序集不包含测试或未找到合适的测试驱动程序
第三步:我注意到我不理解文档
当我重新阅读文档时,我注意到它说我的测试方法可以接受参数并且应该返回一个属性。我显然没有这样做,因为我什么都不返回。
可悲的是,我不明白我实际上应该做什么(而且我对 F# 不够熟悉,无法理解下面的示例......)......(我盲目地尝试了一些随机的东西看起来他们可能有道理,但我从来没有以红色测试结束)
我真的很感激任何能帮助我把这个测试变成红色的指针!
fscheck - 如何使用 C# 中的 FsCheck 自定义生成器?
我有以下代码:
我可以跑
我看到了构造生成器和定义属性的所有方法。
但我只是没有足够快地找到如何一起使用它们。
json - 通过 FsCheck 生成 Json 数组
我是 FsCheck 的新手,我需要一个 json 数组来执行我的测试。
我想要一个简单的解决方案,如下所示:
但主要问题是我找不到Gen.fold
and Gen.finalValueOf
。
unit-testing - 是否应该测试功能组成和管道?
在 F#(和大多数函数式语言)中,一些代码非常短,如下所示:
或者 :
我最终为后一个功能做的最简单的基于属性的测试是:
不管排列部分,测试比被测函数多,所以比被测函数更难阅读!
- 当它比生产代码更难阅读时,测试的价值是什么?
另一方面:
- 我想知道由多个功能组合而成的功能是否可以安全地不被测试?
- 是否应该在集成和接受级别进行测试?
- 如果他们很短但执行复杂的操作怎么办?