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

欢迎!有关此工作如何运作的更多信息,请查看 关于 页面。

+1
测试
封闭
在开发代码时,有时专注于单个失败的测试,而不是在一个命名空间中运行所有测试,这是一种有效的方法。这可能在运行测试需要一定时间或运行测试产生大量失败时是这种情况。目前运行带有固定安排的单个测试的最佳选项是 `test-vars`,类似于


(use 'clojure.test)
(def counter (atom 0))
(defn setup [f] (swap! counter inc) (f)) ;;一颗具有状态的 :once 固定安排
(use-fixtures :once setup)
(deftest ex (println "counter =" @counter))

(test-vars [#'ex])  ;=> counter = 1
(test-vars [#'ex])  ;=> counter = 2


但是,这有以下问题
- 没有测试报告反馈,例如您在运行测试时得到(在成功时没有输出)
- 需要指定变量(而不是符号),并用向量包裹

*提议:* 一个新宏 `run-test`,可指定单个符号并进行与 `run-tests` 相同的测试报告。用法


(use 'clojure.test)
(def counter (atom 0))
(defn setup [f] (swap! counter inc) (f)) ;;一颗具有状态的 :once 固定安排
(use-fixtures :once setup)
(deftest ex (println "counter =" @counter))

(run-test ex)

;=> 测试用户
;=> counter = 1

;=> 执行了 1 个包含 0 个断言的测试。
;=> 0 个失败,0 个错误。
;=> {:test 1, :pass 0, :fail 0, :error 0, :type :summary}

(run-test ex)

;=> 测试用户
;=> counter = 2

;=> 执行了 1 个包含 0 个断言的测试。
;=> 0 个失败,0 个错误。
;=> {:test 1, :pass 0, :fail 0, :error 0, :type :summary}



*补丁:* CLJ-1908-3.patch

*筛选:* Alex Miller
关闭备注: 已在 1.11.0-alpha2 中修复

9 答案

+1
_由 alexmiller 评论:

据我所知,这基本上与 CLJ-866 具有相同的意图,CLJ-866 已经在 Clojure 1.6 中完成。现在您可以使用 {{test-vars}} 做这个


user=> (use 'clojure.test)
nil
用户=> (创建原子计数器 0)
#'user/counter
用户=> (定义设置 [f] (交换! counter 增 1) (调用 f)) ;; 一个带有状态的:once 修复程序
#'user/setup 用户=> (使用修复程序 :once 设置) {:clojure.test/once-fixtures (#object[user$setup 0x7106e68e "user$setup@7106e68e"])} 用户=> (定义测试 ex (打印 "计数器=" (原子@counter))) #'user/ex 用户=> (测试变量 [#'ex])
计数器 = 1
nil
用户=> (测试变量 [#'ex])
计数器 = 2
nil
0

评论者:hlewisship

在使用补丁时遇到了问题,在REPL中运行正常的代码,通过执行 mvn test 时失败。追踪原因需要一些时间。

0

评论者:hlewisship

初步的补丁;代码可以运行,但 mvn test 失败,我还没有找到原因。

0

评论者:hlewisship

感谢 Hiredman,他提供了 insight,指出由于 Maven/Ant 运行测试的方式,背引号是必要的。现在所有测试都通过了。

0

评论者:hlewisship

我认为有优势能够使用符号而不是它的 var 来运行测试。此外,我建议的更改也返回与 run-tests 一样类型的数据。

0

评论者:alexmiller

在进行预筛选之前,我需要对这个补丁做一些修改

  • 补丁应该合并为一个提交
  • 补丁的提交信息应以 "CLJ-1908" 开头
  • 将 run-test* 更改为 run-test-var
  • run-test-var 的文档字符串应如下所示:"在有修复程序和报告的情况下运行 Var v 中的测试。" 删除 "调用的地方" 这句话。
  • run-test 的 docstring 的第一句话应该是: "在当前命名空间中运行单个测试。" 移除 "这应该从交互式环境中(如 REPL)调用。" 最后的句子是正确的。
  • 在 run-test 中,将 * 替换为更简单的 {{(resolve test-symbol)}}。
0

评论者:hlewisship

感谢您的意见;我很快会有一个更新的补丁。

0

评论者:hlewisship

更新了补丁,将所有 Alex 的评论整合。

0
参考: https://clojure.atlassian.net/browse/CLJ-1908(由 hlewisship 提报)
...