2024 年 Clojure 状态调查!分享您的想法。

欢迎!有关此工作方式的更多信息,请参阅关于页面。

+7
测试

查看 clojure.test 编写的测试的 (log) 输出时,我想能够识别与每个测试关联的输出。在 :each fixture 中暴露当前测试变量的一项机制可以实现这一点。

一种机制可能是在调用 clojure.test/test-all-vars 中的 each-fixture-fn 之前,使用当前测试变量绑定一个 test-var 变量。

建议:所提出的补丁 (clj840-20161122.diff) 通过使用 * } 来允许 'each' fixture 访问与正在执行的测试关联的变量。由于这项更改,'each' fixture 能够访问与当前测试变量关联的元数据,包括名称。

该补丁通过更改在运行测试及其关联的 'each' fixture 时函数包裹的顺序来实现上述功能。在此之前,'each' fixture 被组合成一个单一的更高阶函数,然后给它一个包含一个执行 {{test-var}} 函数调用的 thunk 作为其主体。在这个补丁之后,{{test-var}} 函数现在负责连接并执行 'each' fixture,但重要的是,它在添加当前测试变量到 * } 的绑定表达式的范围内这样做。现在,{{test-var}} 调用了连接的 fixture 函数,而不是将一个调用 {{test-var}} 的 thunk 传递给连接的 fixture 函数。

补丁: clj840-20161122.diff

你好,我想发表意见,说我会在自己工作的 Clojure 测试库中找到添加此功能很有用。

对于我的用例,Duncan 的 4 行补丁,它添加 `*test-var*` 和在 `each-fixture-fn` 表达式周围绑定它,足以满足我的需求。

我将在使用基于 `clojure.test` 块(`deftest` + fixture)重新实现 `state-flow` 测试库中使用此功能,以便更好地集成到现有的 Clojure 工具生态系统。如果没有在 fixture 中访问当前测试变量的权限,我将无法在 fixture 中执行某些测试设置(https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74 使用代码勾勒出了用例)

17 个回答

0

评论者:stuart.sierra

或者直接将Var传递给fixture。Vars是可以调用的。

0

评论者:hugoduncan

我认为这样不行,因为传递给fixture的函数不是测试Var,而是调用{{test-var}}的函数。

0

评论者:hugoduncan

添加 test-var 修补程序

0

评论者:stuart.sierra

                                                                *  } already has this information, but it's not visible to the fixture functions because it gets bound inside {{test-var}}.

也许应该在{{:each}} fixture函数中调用{{test-var}}而不是在test-all-vars中调用。(Var的命名空间可以在其元数据中找到。)但这样我们每次都要在{{test-var}}中调用{{join-fixtures}}。

0

评论者:stuart.sierra

尝试这个补丁:clj840-2.diff。

这使得* }能被{{:each}} fixture函数可见,这在直觉上似乎更正确。

但是,这稍微改变了{{test-var}}的行为,这让我不太满意。

0

评论者:hugoduncan

在* }之上提供一个函数来返回当前的test-var是否合理?

0

评论者:stuart.sierra

不是,该函数是 {{first}}

0

评论者:hugoduncan

我同意将动态变量作为扩展接口的一部分,但认为编写测试时的函数会更简洁。仅代表我个人观点。

0

评论由:jafingerhut

在2013年11月22日提交的补丁 clj840-2.diff,已经不再干净地应用于最新的master。更新它可能看起来很简单,但最好由熟悉该代码部分的人来完成。

0

评论由:joelittlejohn

如果这个问题能被解决,我会觉得非常有用。

我已经添加了一个更新的补丁,它具有与 clj840-2.diff 相同的内容,但应用于当前的master(c0326d2),截止到2016年11月22日。

0

评论由:joelittlejohn

我知道我只翻译了别人提供的一个补丁,但如果您认为还需要进一步改进才能将其考虑在内,请告诉我,我将尽力添加额外的内容。谢谢。

0

评论由:alexmiller

如果您能将问题更新为更好地描述补丁的方法,这将很有帮助。

0

评论由:joelittlejohn

提议的补丁(clj840-20161122.diff)允许'每个'装置通过使用*{}来访问当前执行测试关联的变量。由于这个改动,'每个'装置能够访问与当前测试变量关联的元数据,包括名称。

该补丁通过更改在运行测试及其关联的 'each' fixture 时函数包裹的顺序来实现上述功能。在此之前,'each' fixture 被组合成一个单一的更高阶函数,然后给它一个包含一个执行 {{test-var}} 函数调用的 thunk 作为其主体。在这个补丁之后,{{test-var}} 函数现在负责连接并执行 'each' fixture,但重要的是,它在添加当前测试变量到 * } 的绑定表达式的范围内这样做。现在,{{test-var}} 调用了连接的 fixture 函数,而不是将一个调用 {{test-var}} 的 thunk 传递给连接的 fixture 函数。

希望这有点清楚,哈哈 :)

0

评论由:joelittlejohn

现在是否有可能考虑将其包含在内?文件clj840-20161122.diff仍然有效,并且可以应用于master的当前HEAD。

0

评论由:alexmiller

你能检查一下更改函数顺序是否影响了do-report中的堆栈跟踪检查吗?基本上,了解所有各种情况(既不每个也不一次,既每个也不一次,只有一次也不每个,以及两次)对于所有那些情况,错误报告都不会受到影响会很有帮助。另外,像Leiningen这样的工具也会对这部分进行Holiday补丁。我认为所有这些都很正常,但可能我很快不会去检查所有这些。

...