2024 Clojure调查问卷!中分享您的想法。

欢迎!有关如何使用本站的信息,请参阅关于页面。

+7
测试

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

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

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

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

补丁:clj840-20161122.diff

你好,我想发表意见,说我认为我在开发的Clojure测试库中加入此功能将是有用的。

对于我的用例,Duncan的将`*test-var*`添加到并绑定在`each-fixture-fn`形式上的4行补丁就足够了。

我计划用一个基于基础 `clojure.test` 块(`deftest` + fixtures)重实现的 `state-flow` 测试库中的这个特性,以便更好地与现有的 Clojure 工具生态系统集成。由于无法访问当前测试变量,我无法在 fixtures 中找到执行某些测试设置的方法。(有关代码用例的示例,请参阅 https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74

17 个答案

0

评论者:stuart.sierra

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

0

评论者:hugoduncan

我不认为这起作用,因为传递给 fixtures 的函数并不是测试 var,而是一个在 test 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' 配置项通过使用 *} 访问当前正在执行测试相关联的变量。此更改的结果是,'each' 配置项能够访问当前测试变量的元数据,包括名称。

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

希望这已经很清晰了 :)

0

评论者:joelittlejohn

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

0

评论者:alexmiller

你能检查一下更改函数顺序是否影响了 do-report 中的堆栈跟踪检查吗?基本上,需要知道在所有各种情况下(既不是每个也不是一次,每个但不一次,一次但不每个,以及两者)错误报告在所有这些情况下都不会受到影响。此外,工具如 Leiningen 也会对其进行 monkeypatch。我想所有这些都很好,但我可能不会有时间很快进行检查。

...