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

欢迎!请参阅 关于 页面了解更多关于这种方式的信息。

+7
Test

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

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

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

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

补丁: clj840-20161122.diff

by
您好,我想就此做出评论,表示我觉得在我在工作的 Clojure 测试库中添加这项功能将很有用。

对于我的使用案例,Duncan 的 4 行补丁就足够添加 `*test-var*` 并在 `each-fixture-fn` 表达式周围进行绑定。

我计划使用这个特性在重新实现 `state-flow` 测试库时,使用基本的 `clojure.test` 块(`deftest` + 固定设施)来允许更好地与现有的 Clojure 工具生态系统集成。由于无法在固件中访问当前的测试变量,我无法找到一种在固件中执行某些测试设置的方式(https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74 在代码中概述了用例)。

17 答案

0
by

评论者:stuart.sierra

或者就直接将 Var 直接传递到固件中。Vars 可以调用。

0
by

评论者:hugoduncan

我认为这不太可能工作,因为传递给固件的函数不是测试变量,而是调用 {{test-var}} 的函数。

0
by

评论者:hugoduncan

补丁添加 test-var

0
by

评论者:stuart.sierra

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

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

0
by

评论者:stuart.sierra

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

这使得 * } 可见于 {{:each}} 固定设施函数,这在直观上似乎更正确。

但是这稍微改变了 {{test-var}} 的行为,这对于我来说不太高兴。

0

评论者:hugoduncan

在 * } 之上提供一个函数以返回当前测试变量合理吗?

0

评论者:stuart.sierra

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

0

评论者:hugoduncan

我同意将动态变量作为扩展接口的一部分,但如果有一个在编写测试时使用的函数会更清晰。仅代表我个人看法。

0

评论者:jafingerhut

2013年11月22日提交的PATCH clj840-2.diff 似乎不再适用于最新的master版本。更新它看起来可能很直接,但最好由熟悉这部分代码的人来做。

0

评论者:joelittlejohn

如果能修复这个,我会觉得非常有用。

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

0

评论者:joelittlejohn

我明白我只翻译了别人提供的补丁,但如果您觉得这个补丁在被认为是合适的状态之前还需要做些什么,请大声说出,我会尽力添加一些东西。谢谢。

0

评论者:alexmiller

如果您能更新工单以更好地描述补丁的方案,将会有所帮助。

0

评论者:joelittlejohn

建议的补丁(clj840-20161122.diff)允许'each' fixtures通过使用*}访问当前正在执行的测试相关的var。由于这项更改,'each' fixtures可以访问与当前测试var相关联的元数据,包括名称。

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

希望这足够清楚 :)

0

评论者:joelittlejohn

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

0

评论者:alexmiller

您能否检查在此处更改函数顺序是否影响了do-report中的堆栈跟踪检查?基本来说,这将有助于了解在所有各种情况下(既不是each也不是once,既不是each也不是once,也不是once也不是each,两者的都有)错误报告对所有这些情况的均未受影响。此外,像Leiningen这样的工具也会对该部分进行monkeypatch。我认为这些都是可以的,但可能不会很快检查所有这些。

...