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

欢迎!请参阅 关于 页面以获取更多信息。

+7
测试

在查看使用 clojure.test 编写的测试的 (log) 输出时,我希望能够识别与每个测试相关的输出。一种在 :each 套件中公开当前测试变量的机制将使这成为可能。

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

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

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

补丁: 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的函数不是测试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
by

评论者:hugoduncan

在 * } 上提供一个函数来返回当前的 test-var 是否有意义?

0
by

评论者:stuart.sierra

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

0
by

评论者:hugoduncan

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

0
by

评论者:jafingerhut

2013年11月22日提交的补丁 patch 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'固定值通过使用*} 来访问当前执行测试关联的变量。由于此更改,'each'固定值能够访问与当前测试变量关联的元数据,包括名称。

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

希望这应该很清楚,对吧 :)

0

评论者:joelittlejohn

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

0

评论者:alexmiller

您能否检查更改函数顺序是否影响了do-report中的堆栈跟踪检查?基本上,了解所有不同案例(既不是each也不是once,每个但不是once,once但不是each,两者都是)中错误报告是否未受到影响将是有帮助的。同时,像Leiningen这样的工具也修补了该部分的某些部分。我认为这些都是好的,但我可能不会很快赶上检查所有这些。

...