问题标签 [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.

0 投票
1 回答
115 浏览

f# - 是否可以在无需将测试代码标记为内部的情况下测试内部代码?

我有一个 F# 库,里面有很多我想测试的非公开内容。目前,所有不属于程序集公共 API 的代码都被标记internal(具体来说,它被放置在被标记的模块中internal)。我使用InternalsVisibleToAttribute使此代码对我的测试程序集可见。但是,为了编译测试程序集,所有在其签名中使用内部类型的测试(其中大多数,因为我使用 FsCheck 自动生成测试输入)也必须标记为内部(这需要应用于每个函数,因为 xunit 不会发现内部模块)。此外,专门用于 FsCheck 生成的任何类型(例如type ValidCustomer = ValidCustomer of CustomerCustomer是我的内部域类型)也需要标记为内部,并且 FsCheck 在创建内部类型时似乎卡住了,因此测试不运行。

有什么方法可以测试内部 F# 代码(来自单独的测试程序集),而不必将签名依赖于内部类型的所有测试标记为内部?现在我只是倾向于在原始代码中根本不做任何内部事情,但理想情况下,有一种方法可以让我的干净 API 蛋糕也吃掉。

0 投票
1 回答
1736 浏览

c# - C#、xunit、fscheck,使用自定义生成器或受约束的随机字符串编写基于属性的简单测试

我正在尝试解决菱形 kata,以便学习如何使用 fscheck 库编写基于属性的测试。我想用 C# 编写测试,我正在使用 Visual Studio 2017。

我想编写一个基于属性的测试,它不会生成任何随机字符作为输入,而只会生成字母。我不确定如何编写生成器 fscheck 需要执行此操作以及将代码放在哪个文件中?

我到处搜索并阅读文档,但遇到了麻烦(部分原因是我不能很好地将 F# 翻译成 C#)。

如何[Property]用于将输入数据限制为仅字母?

如果有更好的方法请告诉我。

[编辑:]

我编辑了我的代码示例,现在包含 Kurt Schelfthout 的一个工作解决方案。



测试


测试类

0 投票
1 回答
765 浏览

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>类,但它的界面让我很困惑......我尝试了以下但仍然PositiveInts 超过了字符串:

0 投票
1 回答
150 浏览

unit-testing - F# 测试结果是否为 Some(any)

我需要检查我的验证函数是否some在失败或none. 如果返回Some<string>,则存在验证错误,否则有效且函数返回None。这是我的尝试,但重构并不安全:

0 投票
1 回答
341 浏览

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# 控制台应用程序进行了相同的测试,并且自定义工作也按预期工作。PatternGen.elementsGen.nonEmptyListOfArbitrary

出了什么问题?在 Xunit 中运行时 FsCheck是否回退到默认值string Arbitrary

您可以克隆此 repo 以亲自查看:https ://github.com/bert2/GlobMatcher

(我不想使用Prop.forAll,因为每个测试都会有多个 customArbitrary并且Prop.forAll不适合。据我所知,我只能将它们组合起来,因为 F# 版本Prop.forAll只接受一个Arbitrary。)

0 投票
1 回答
313 浏览

f# - 如何将 FsCheck 生成器列表累积为单个值?

我编写了一个 FsCheck 生成器,它产生随机 glob 语法模式(例如a*c?)以及与该模式匹配的随机字符串(例如abcd)。但是我的解决方案使用了一个可变变量,我对此感到很惭愧。看一看:

请注意,它text是可变的,以及它的值是如何在循环中累积的。

我的直觉告诉我,必须有一种方法可以fold将生成器导入text,但我不知道如何,因为我不了解let!引擎盖下的工作原理(还)。我正在考虑类似于以下内容:

我在正确的轨道上吗?累加器和种子应该是什么fold样的?

0 投票
3 回答
1464 浏览

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# 不够熟悉,无法理解下面的示例......)......(我盲目地尝试了一些随机的东西看起来他们可能有道理,但我从来没有以红色测试结束)

我真的很感激任何能帮助我把这个测试变成红色的指针!

0 投票
1 回答
1298 浏览

fscheck - 如何使用 C# 中的 FsCheck 自定义生成器?

我有以下代码:

我可以跑

我看到了构造生成器和定义属性的所有方法。

但我只是没有足够快地找到如何一起使用它们。

0 投票
1 回答
151 浏览

json - 通过 FsCheck 生成 Json 数组

我是 FsCheck 的新手,我需要一个 json 数组来执行我的测试。

我想要一个简单的解决方案,如下所示:

但主要问题是我找不到Gen.foldand Gen.finalValueOf

0 投票
2 回答
293 浏览

unit-testing - 是否应该测试功能组成和管道?

在 F#(和大多数函数式语言)中,一些代码非常短,如下所示:

或者 :

我最终为后一个功能做的最简单的基于属性的测试是:

不管排列部分,测试比被测函数多,所以比被测函数更难阅读!

  • 当它比生产代码更难阅读时,测试的价值是什么?

另一方面:

  • 我想知道由多个功能组合而成的功能是否可以安全地不被测试?
  • 是否应该在集成和接受级别进行测试?
  • 如果他们很短但执行复杂的操作怎么办?