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

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

+7
Test

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

一种机制可能是先在 clojure.test/test-all-vars 的每个-fixture-fn 调用之前绑定一个 test-var 变量与当前测试变量。

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

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

补丁: clj840-20161122.diff

您好,我想表达一下我的看法,即我认为在我在工作的 Clojure 测试库中添加此功能将是很有用的。

对我的用例而言,Duncan 的添加 `*test-var*` 并将其绑定在 `each-fixture-fn` 表达式周围的 4 行补丁就足够了。

我将使用此功能在 `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的函数不是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的命名空间 exist 于其元数据中。)但这样一来,每次在{{test-var}}中都必须调用{{join-fixtures}}。

0 投票

评论作者:stuart.sierra

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

这使得* }可见于{{:each}}fixture函数,这在直观上似乎更正确。

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

0 投票

评论作者:hugoduncan

在* }之上提供一个函数以返回当前的test-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日的current master (c0326d2)。

0 投票

评论者:joelittlejohn

我明白我只翻译了其他人提供的补丁,但如果您认为在正式考虑之前这个补丁还需要进一步的内容,请随时告知,我将尽力添加。

0 投票

评论者:alexmiller

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

0 投票

评论者:joelittlejohn

提出的补丁(clj840-20161122.diff)允许 'each' 测试用例通过 * } 访问当前正在执行的测试的 var。由于这个更改,'each' 测试用例能够访问与当前测试 var 关联的元数据,包括名称。

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

希望这足够清晰了 :)

0 投票

评论者:joelittlejohn

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

0 投票

评论者:alexmiller

你能检查一下改变函数顺序是否会影响 do-report 中的堆栈跟踪检查吗?这样做将有助于知道在各种情况(无论是每个还是一次,或者既不是每个也不是一次,是一次但不是每个,或者两个都是)下,错误报告都没有受到影响。工具如 Leiningen 也会对这部分进行 monkeypatch。我觉得这些都很好,但我可能很快不会检查所有这些。

...