请在 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}} 来调用连接的 fixtures 函数,而不是将包含调用 {{test-var}} 的 thunk 传递给连接的 fixtures 函数。

补丁: 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
by

评论者:stuart.sierra

或者直接将 Var 直接传递到 fixture 中。Vars 可调用。

0
by

评论者:hugoduncan

我觉得这样不行,因为传递给 fixture 的函数不是测试 var,而是一个在测试 var 上调用 {{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}} fixture 函数而不是在 test-all-vars。 (Var 的命名空间可在其元数据中找到。)但这样我们每次都必须在 {{test-var}} 内部调用 {{join-fixtures}}。

0
by

评论者:stuart.sierra

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

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

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

0
by

评论者:hugoduncan

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

0
by

评论者:stuart.sierra

不,该函数是 {{first}}

0
by

评论者:hugoduncan

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

0
by

评论人:jafingerhut

2013年11月22日提交的一个补丁,补丁 clj840-2.diff 现在不再适用于最新的 master。更新它似乎很简单,但最好找一个对这个代码部分非常了解的人来做。

0
by

评论人:joelittlejohn

如果能修复这个问题我会非常感激。

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

0
by

评论人:joelittlejohn

我知道我只翻译了一篇别人提供的补丁,但如果在将其认为适合考虑之前您觉得还需要做些什么,请大声告诉我,我会努力添加更多内容。谢谢。

0

评论者:alexmiller

如果您能更新票据更好地描述补丁的方法,那就很有帮助了。

0

评论人:joelittlejohn

建议的补丁(clj840-20161122.diff)允许'each' fixture通过使用*}访问当前正在执行的测试相关联的var。由于这个变更,'each' fixture现在能够访问当前test var的相关元数据,包括名称。

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

希望这很清晰:<)

0

评论人:joelittlejohn

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

0

评论者:alexmiller

你能检查一下更改函数顺序是否影响了 do-report 中的堆栈跟踪检查吗?基本上,对于所有各种情况( neither each nor once,each but not once,once but not each,and both),都需要知道错误报告不受所有这些情况的影响。此外,像 Leiningen 这样的工具也会对这部分进行 monkeypatch。我认为这些都是好的,但我可能不会很快检查所有这些。

欢迎来到 Clojure Q&A,在这里您可以向 Clojure 社区的成员提问并获得答案。

分类

...