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

欢迎!请在 关于 页面了解更多关于如何使用本网站的信息。

+7
测试

在查看使用 clojure.test 编写的测试的 (log) 输出时,我想能够识别与每个测试关联的输出。一种在 :each 固定设施中暴露当前 test-var 的机制可以实现这一点。

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

建议: 建议的补丁 (clj840-20161122.diff) 允许 'each' 固定设施使用 * } 访问当前执行测试的 var。因此,由于这项更改,'each' 固定设施能够访问当前 test-var 的元数据,包括名称。

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

补丁: clj840-20161122.diff

你好,我想表达一下,我认为在 Clojure 测试库中加入这个功能会很有用。

对于我的用例来说,Duncan 的 4 行补丁就足够了,该补丁添加了 `*test-var*` 并将其绑定在 `each-fixture-fn` 表达式周围。

我打算使用这个特性来重新实现`state-flow`测试库,使用基本的`clojure.test`块(`deftest` + fixtures)以更好地与现有的Clojure工具生态系统集成。由于无法访问在fixture中的当前测试变量,我无法在fixture中执行某些测试设置(https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74用代码说明了用例

17 答案

0

评论者:stuart.sierra

或者,直接将这个Var传递到fixture中。Vars是可以调用的。

0

评论者:hugoduncan

我认为这不起作用,因为传递给fixture的函数不是测试变量,而是一个调用{{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}}.

也许应该在{{test-var}}而不是在{{test-all-vars}}中调用{{:each}} fixture函数。(命名空间在Var的元数据中是可用的。)但是此时我们必须在{{test-var}}中每次都调用{{join-fixtures}}。

0

评论者:stuart.sierra

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

这使得{{{test-var}}}对{{:each}} fixture函数可见,这在直觉上似乎更正确。

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

0

评论者:hugoduncan

在 * } 之上提供一个函数以返回当前的测试变量是否合适?

0

评论者:stuart.sierra

不一定,这个函数就是 {{first}}

0

评论者:hugoduncan

我同意将动态变量作为扩展接口的一部分,但以为提供一个用于编写测试时使用的函数会更简洁。仅代表我的一点看法。

0

评论者:jafingerhut

于2013年11月22日提交后,补丁 clj840-2.diff 对最新主分支不再适用。更新它看起来很简单,但最好由了解这部分代码的人来做。

0

评论者:joelittlejohn

如果能修复这个问题将非常有用。

我已添加了一个更新后的补丁,它与 clj840-2.diff 具有相同的内容,但适用于2016年11月22日的当前主分支(c0326d2)。

0

评论者:joelittlejohn

我意识到的只是翻译了由其他人提供的补丁,但如果您认为在它适合被考虑之前还需要进一步的事情,请提出,我将尽力添加。

0
by

由:alexmiller发表的评论

如果您能更新工单以更好地描述补丁的修改方法将非常有帮助。

0
by

评论者:joelittlejohn

建议的补丁(clj840-20161122.diff)允许“each”测试环境通过使用*}来访问当前正在执行的测试相关联的var。由于这一变化,'each'测试环境现在可以访问与当前测试var关联的元数据,包括名称。

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

希望这已经足够清楚了 :)

0
by

评论者:joelittlejohn

现在是否有可能考虑将其包含在内?文件clj840-20161122.diff仍然有效,并可以应用到master的最新HEAD版本。

0
by

由:alexmiller发表的评论

您可以检查是否改变函数的顺序已经影响了do-report中的堆栈跟踪检查吗?基本的目的是,对于所有各种情况(既不是each也不是once,两者都是的each和非once,或者只有once而没有each,两者都有)需要知道错误报告在所有这些情况中都不会受到影响。另外,像Leiningen这样的工具也会对这部分进行monkeypatch。我认为所有这些都很好,但我可能不会很快检查所有这些。

...