请在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


然而,这有一些问题
- 没有测试报告反馈,如运行-tests 所得到的那样(在成功时,没有输出)
- 需要指定变量(不是符号),并用向量包装

*建议:* 一个新的宏 `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

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


user=> (use 'clojure.test)
nil
user=> (def counter (atom 0))
#'user/counter
user=> (defn setup [f] (swap! counter inc) (f)) ;; 这是一个具有状态的:once 固件
#'user/setup user=> (use-fixtures :once setup) {:clojure.test/once-fixtures (#object[user$setup 0x7106e68e "user$setup@7106e68e"])} user=> (deftest ex (println "counter =" @counter)) #'user/ex user=> (test-vars [#'ex])
counter = 1
nil
user=> (test-vars [#'ex])
counter = 2
nil
0 投票

评论人:hlewisship

在打补丁时遇到了麻烦,那就是在REPL运行正常,但是通过 mvn test 运行时会失败。追踪原因花了一些时间。

0 投票

评论人:hlewisship

最初的补丁;代码可以工作,但mvn test失败,我还没有弄清楚原因。

0 投票

评论人:hlewisship

感谢Hiredman,提供了关于需要引号的原因的见解,因为Maven/Ant以这种方式运行测试。现在所有测试都通过了。

0 投票

评论人:hlewisship

我认为能够通过符号而不是其变量运行测试有一些优点。此外,我提出的更改也返回与run-tests相同类型的数据。

0 投票

评论人:alexmiller

在进行预审查之前需要对这个补丁进行一些更改

  • 补丁应该合并为单个提交
  • 补丁的提交消息应该以 "CLJ-1908" 开头
  • 将 run-test* 改为 run-test-var
  • run-test-var 的文档字符串应为:“使用固件和报告运行 Var v 中的测试。”移除“从…调用”的句子。”
  • run-test 的文档字符串的第一句应为:“在当前命名空间中运行单个测试。”移除“这是用来在REPL中调用的,从REPL中触发。”最后一句是可以的。
  • 在 run-test 中,将 * 替换为更简单的 {{(resolve test-symbol)}}。
0 投票

评论人:hlewisship

感谢您的贡献;我将在不久后提供更新的补丁。

0 投票

评论人:hlewisship

更新了补丁,压缩并反映了Alex的所有评论。

0 投票
参考:[https://clojure.atlassian.net/browse/CLJ-1908](https://clojure.atlassian.net/browse/CLJ-1908) (由 hlewisship 报告)
...