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

欢迎!请查看关于页面以了解更多关于这是如何工作的信息。

0
测试

给定以下代码

(deftest a-test
  (is false))

运行测试产生以下输出

FAIL in (a-test) (form-init1218676551285641018.clj:28)
expected: false
  actual: false

行为是正确的。

这个错误信息很令人困惑,原因有几个

  • 在这种情况下没有任何预期值。我没有使用 (is (= expected actual))
  • 正如打印出的“预期”和“实际”一样,它们是相同的值,但测试失败了。

2 个回答

+2

如果你使用一个产生 false 的变量或表达式,这会让这里发生的事情更加明显

user=> (def v false)
#'user/v
user=> (t/deftest foo (t/is v))
#'user/foo
user=> (foo)

FAIL in (foo) (NO_SOURCE_FILE:4)
expected: v
  actual: false
nil
user=> 

expected: 行实际上是“我预期这个表达式会返回真值”的缩写,所以在你的例子中,它是在说“我预期 false 会返回真值”(但实际上它的值是 false)。

clojure.test 当然可以产生更好的输出 — Jay Fields 的 Expectations 库和 Paul Stadig 的 clojure.test 扩展 Humane Test Output 所做的许多原始工作,都是为了在断言失败时产生更好的错误信息。

当我将 Expectations 中的 clojure.test 兼容性工作提取出来,并转变为一个独立的库 https://github.com/clojure-expectations/clojure-test 时,我失去了一些真正不错的失败信息,因为我都从 Expectations 的报告引擎切换到了 clojure.test 的报告引擎。我和 Alex Miller 谈过在未来的某个时间点将 clojure.test 从 Clojure "核心" 分离出来的可能性,并表达了我接管维护工作的兴趣……我不知道这会不会发生,时间表会是什么。

+1

你有没有更有用的(is ...)测试表达式示例,产生类似混淆的输出?

如果唯一的例子是(is false),似乎Clojure的开发者不太可能更改clojure.test库。

没有,这是我遇到过的唯一案例。
...