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

欢迎!请参阅 关于页面 获取更多关于此网站如何运作的信息。

+7
测试

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

一种可能的机制可能是,在 clojure.test/test-all-vars 中的 each-fixture-fn 调用之前,将一个 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 的 4 行补丁已足够,该补丁添加了 `*test-var*` 并将其绑定在 `each-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发表

添加关于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}}.

也许应该在每个 fixture 函数中调用 {{:each}} 而不是在 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日提交的commit中,patch clj840-2.diff无法干净地应用于最新的master分支。更新它可能看起来很简单,但最好由熟悉这部分代码的人来完成。

0

评论者:joelittlejohn

如果这个问题能解决,我会觉得非常有用。

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

0

评论者:joelittlejohn

我意识到我只翻译了其他人提供的补丁,但如果您认为这个补丁还需要进一步处理才能被考虑,请随时告诉我,我将尽力添加更多内容。谢谢。

0

评论者:alexmiller

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

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。我认为所有这些都是可以接受的,但我可能不久就会有时间去检查所有这些。

...