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}} 函数调用的厚块的厚块。在此补丁之后,现在 {{test-var}} 函数负责连接和执行 'each' fixture,但重要的是,它是在添加当前测试变量的绑定表达式的范围内完成的。{{test-var}} 现在调用连接的 fixture 函数,而不是将调用 {{test-var}} 的厚块提供给连接的 fixture 函数。

补丁: clj840-20161122.diff

你好,我想表达我支持这个功能的添加,我认为它在我在工作的 Clojure 测试库中将很有用。

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

我将使用此功能在 `state-flow` 测试库的重实现中,使用基本的 `clojure.test` 块(`deftest` + fixture)来允许更好地与现有的 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,而是一个调用{{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-var}}中调用,而不是在test-all-vars中调用。(Var的命名空间可以在其元数据中找到。)但这样每次都要在{{test-var}}内部调用{{join-fixtures}}。

0
by

评论者:stuart.sierra

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

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

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

0
by

评论者:hugoduncan

在* }之上提供一个函数来返回当前测试Var是否合理?

0

评论者:stuart.sierra

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

0

评论者:hugoduncan

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

0

评论者:jafingerhut

在2013年11月22日提交的提交后,补丁 clj840-2.diff 无法干净地应用于最新的 master。更新它看起来可能很简单,但最好让熟悉这部分代码的人来完成。

0

评论者:joelittlejohn

如果这个问题能被修复,那会很有用。

我已添加了一个更新的补丁,其内容与 clj840-2.diff 相同,但针对的是2016年11月22日的当前 master (c0326d2)。

0

评论者:joelittlejohn

我意识到我只翻译了其他人提供的补丁,但如果您认为这个补丁需要进一步修改才能被考虑,请随时提出,我将尽力添加一些东西。谢谢。

0

评论者:alexmiller

如果您能更新工单,更好地描述补丁的方案,那就帮很大忙。

0

评论者:joelittlejohn

提议的补丁(clj840-20161122.diff)允许 'each' 部署通过 * {} 访问当前正在执行测试的关联变量。由于这个改动,'each' 部署可以访问与当前测试变量关联的元数据,包括名称。

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

希望这已经很清晰了,亲 :)

0

评论者:joelittlejohn

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

0

评论者:alexmiller

你能检查一下修改函数顺序是否影响了 do-report 中的堆栈跟踪检查吗?基本来说,知道在所有各种情况下(既不是每个,也不是一次,既是每个也不是一次,只一次但不每个,和两者都是)错误报告在所有这些情况下都不会受到影响将会很有帮助。此外,像 Leiningen 这样的工具也会篡改其部分。我认为所有这些都是可以接受的,但我可能不会很快就进行检查。

...