Clojure 2024 年度调查中分享您的想法!

欢迎!请参阅 关于 页面以获取更多关于如何使用本站的信息。

+3
测试

如果在测试执行过程中抛出异常,那么文件名和行号通常对找到问题的帮助不大。例如,以下代码

`
(require '[clojure.test :refer [deftest test-var]])

(deftest foo
(meta))

(test-var #'foo)
`

会在 AFn.java:429 处输出错误。

`
ERROR in (foo) (AFn.java:429)
未捕获异常,不在断言中。
期望:nil
实际:clojure.lang.ArityException: 传递给 core/meta--4144 的参数数量错误 (0)
at clojure.lang.AFn.throwArity (AFn.java:429)

clojure.lang.AFn.invoke (AFn.java:28)
user/fn (error_reporting.clj:4)
clojure.test$test_var$fn__7670.invoke (test.clj:704)
clojure.test$test_var.invoke (test.clj:704)
user$eval6.invoke (error_reporting.clj:6)
clojure.lang.Compiler.eval (Compiler.java:6782)
...etc

`

(link: http://dev.clojure.org/jira/browse/CLJ-377?focusedCommentId=24016&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-24016 text: Rich's Comment 24016 on CLJ-377) 表示他认为应该报告测试文件行而非抛出异常的位置。

方法: 从错误堆栈跟踪的顶部过滤堆栈跟踪类前缀 {{clojure.lang.AFn}}。

应用补丁后,上面的例子输出 error_reporting.clj:4

`
ERROR in (foo) (error_reporting.clj:4)
未捕获异常,不在断言中。
期望:nil
actual: clojure.lang.ArityException: 传递给 core/meta--4141 的参数数量错误 (0)
at clojure.lang.AFn.throwArity (AFn.java:429)

clojure.lang.AFn.invoke (AFn.java:28)
user$fn__3.invokeStatic (error_reporting.clj:4)
user/fn (error_reporting.clj:3)
clojure.test$test_var$fn__114.invoke (test.clj:705)
clojure.test$test_var.invokeStatic (test.clj:705)
clojure.test$test_var.invoke (test.clj:-1)
user$eval6.invokeStatic (error_reporting.clj:6)
user$eval6.invoke (error_reporting.clj:-1)
clojure.lang.Compiler.eval (Compiler.java:6939)
...etc

`

补丁: clj-1811.patch

8 答案

0

评论者:ryfow

示例文件来自描述

0

评论由:alexmiller 发布

在 Github 上快速搜索显示,许多用户调用了(诚然是私有的)文件和行函数。这些用户可能会被补丁破坏。也许最好是创建一个新的函数或一个新的参数数量,而不是删除现有的参数数量。

仅仅是看一下,但我怀疑你在新代码中的几个地方引入了反射,尤其是这些可能还需要另一个类型提示

  1. (.getName (.getClass (:test (meta test-var))))
  2. (= (.getClassName %) test-var-class-name)

我需要查看更多的代码,才能对其他一切做出判断。看到 test-vars 在那里意味着这个函数现在依赖于外部状态,因此需要仔细思考,确保每个调用上下文都有那个全局状态(或者如果它没有,也不会以错误的方式失败)。在票据描述的“方法”部分看到一个关于这方面的讨论将很有帮助。

0

评论者:ryfow

第二次尝试修补这个问题。纠正问题(链接: http://dev.clojure.org/jira/browse/CLJ-1811?focusedCommentId=41115&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-41115 文本:Alex 提出了意见)

0

评论者:ryfow

我在“方法”部分补充了一些细节。

我还添加了一个新的补丁 LINE_REPORTING_2.patch,用于处理反射警告,恢复 {{file-and-line}} 的旧参数数量,并添加防止人们从测试上下文外部调用 {{file-and-line}} 的保护措施。

0

评论者:ryfow

在与我的同事 James 讨论一个问题的时候,我意识到这个修复有助于共享函数调用 {{(is)}}。注意,在使用 LINE_REPORTING_2.patch 应用的样本代码的运行中报告了行 7。这个测试行通常比共享函数行更有用。

`
ryans-mbp:~/oss/clojure% cat -n error_reporting.clj

 1  (require '[clojure.test :refer [deftest test-var is]])
 2
 3  (defn shared-code [arg]
 4    (is arg))
 5
 6  (deftest test-shared-code
 7    (shared-code false))
 8
 9  (test-var #'test-shared-code)

ryans-mbp:~/oss/clojure% java -jar ~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar ./error_reporting.clj

在测试共享代码 (error_reporting.clj:4) 中失败
期望: arg
实际: false
ryans-mbp:~/oss/clojure% java -jar target/clojure-1.8.0-master-SNAPSHOT.jar ./error_reporting.clj

在测试共享代码 (error_reporting.clj:7) 中失败
期望: arg
实际: false
`

0

评论由:michaelblume 发布

补丁不再适用,但也许这已经被 CLJ-1856 解决了?

0

评论由:alexmiller 发布

这不仅没有通过 CLJ-1856 得到修复,但如果在查找位置时从错误堆栈跟踪中过滤出 clojure.lang.AFn,那么这可能会得到修复。这很具体——也许应该将其扩展到其他调用路径,但我不确定。

附上一个新补丁,该补丁应用了这个过滤。

0
参考:[https://clojure.atlassian.net/browse/CLJ-1811](https://clojure.atlassian.net/browse/CLJ-1811)(由 ryfow 报告)
...