请在 2024 年 Clojure 稳定状态调查 中分享您的想法!

欢迎!请在 关于 页面查看有关如何使用本站的一些更多信息。

+7
测试

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

一种可能的机制是在 clojure.test/test-all-vars 中调用每个集合函数之前,使用当前测试变量将 test-var 变量绑定。

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

该补丁通过更改在运行测试及其相关“each”集合时函数包装的顺序来实现上述功能。在此补丁之前,“each”集合被组合成一个单一的高级函数,然后向该高阶函数提供一个包含调用 {{test-var}} 函数的 thunks 作为其主体。在此补丁之后,{{test-var}} 函数现在负责连接和执行“each”集合,但最重要的是,它是在添加当前测试变量到 * } 的绑定表达式范围内执行的。{{test-var}} 现在调用连接的固定函数,而不是给连接的固定函数一个调用 {{test-var}} 的 thunks。

补丁: clj840-20161122.diff

你好,我想发表我的看法,说我会在我在工作的 Clojure 测试库中添加这个功能是有用的。

对于我的用例,Duncan 的四个音符的补丁,它添加 `*test-var*` 并将其绑定到 `each-get-fixture-fn` 形式,对我来说就足够了。

我会使用这个特性来重用 `state-flow` 测试库,该库使用基本的 `clojure.test` 块(`deftest` + 集合)来允许更好地与现有的 Clojure 工具生态系统集成。没有在固定中访问当前测试变量,我就无法在固定中执行某些测试设置(有关用例的代码参考:https://gist.github.com/philomates/32f8e1f7a2a4e746ac0186964aaaa2d3#file-flow-clj-L74)

17 条回答

0

评论者:stuart.sierra

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

0

评论者:hugoduncan

我认为这不会奏效,因为传递给fixture的函数并不是测试Var,而是一个在测试Var上调用{{test-var}}的函数。

0

评论者:hugoduncan

修补测试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-all-vars}}中不同的情况下,在{{test-var}}中调用{{:each}} fixture函数。 (Var的名称空间可以在它的元数据中找到。) 但这样一来,每次我们都要在{{test-var}}中调用{{join-fixtures}}。

0

评论者:stuart.sierra

尝试此补丁:clj840-2.diff。

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

但是,它略微改变了{{test-var}}的行为,这让我不太高兴。

0

评论者:hugoduncan

在* }上面提供一个函数来返回当前测试Var,这可能合理吗?

0

评论者:stuart.sierra

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

0

评论者:hugoduncan

我同意将动态变量作为扩展接口的一部分,但认为有一个适用于编写测试的函数会更清晰。只是我的看法。

0

评论者:jafingerhut

在2013年11月22日的一次提交中,补丁 patch clj840-2.diff 无法无错地应用于最新的 master。更新它看起来可能很直接,但最好由熟悉这部分代码的人来做。

0

评论者:joelittlejohn

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

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

0

评论者:joelittlejohn

我明白我只翻译了别人提供的一个补丁,但如果你们觉得这个补丁在经过更进一步的改进后更适合考虑,请大声说出来,我将努力添加更多内容。谢谢。

0

评论者:alexmiller

如果您能更新请求以更好地描述补丁的方法,将会有所帮助。

0

评论者:joelittlejohn

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

该补丁通过更改在运行测试及其相关“each”集合时函数包装的顺序来实现上述功能。在此补丁之前,“each”集合被组合成一个单一的高级函数,然后向该高阶函数提供一个包含调用 {{test-var}} 函数的 thunks 作为其主体。在此补丁之后,{{test-var}} 函数现在负责连接和执行“each”集合,但最重要的是,它是在添加当前测试变量到 * } 的绑定表达式范围内执行的。{{test-var}} 现在调用连接的固定函数,而不是给连接的固定函数一个调用 {{test-var}} 的 thunks。

希望这很清晰吧 :)

0

评论者:joelittlejohn

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

0

评论者:alexmiller

你能检查一下更改函数顺序是否影响到do-report中的堆栈跟踪检查吗?基本情况是很有帮助的,要知道在所有各种情况下(既不是each也不是once,是each但不是once,是once但不是each,两种情况都有)错误报告均不受影响。此外,像Leiningen这样的工具也对此部分进行monkeypatch。我认为这些都是可以接受的,但我可能不会在不久的将来检查所有这些。

...