请在Clojure 2024调查问卷!中分享您的想法。

欢迎!有关如何使用本站点的更多信息,请参阅关于页面。

+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-tests相同的测试报告反馈(在成功时没有输出)
- 需要指定var(而不是符号)并放在一个向量中

*建议:*一个新的宏`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具有相同的目的,它在Clojure 1.6中完成。现在您可以使用{{test-vars}}完成此操作


user=> (use 'clojure.test)
nil
user=> (def counter (atom 0))
#'user/counter
user=> (defn setup [f] (swap! counter inc) (f)) ;; 一个带状态的once fixture
#'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中运行测试,带有fixture和报告。"删除"从调用中"这句话。
  • run-test的文档字符串的第一句话应该是:"在当前命名空间中运行单个测试。"删除"这旨在通过REPL交互式调用。"最后一句话是好的。
  • 在run-test中,将*替换为更简洁的{{(resolve test-symbol)}}。
0 投票

评论者:hlewisship

感谢您的反馈;我很快会提供一个更新补丁。

0 投票

评论者:hlewisship

更新补丁,已合并 Alex 的所有评论。

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