如何在clojure.test中抑制/捕获defspec的输出?
解决test.check defspec与clojure.test配合时的输出污染问题
当使用test.check的defspec配合clojure.test运行时,默认会打印测试结果的map信息,污染单元测试日志。可以通过以下几种方式解决:
全局禁用test.check结果打印
直接修改test.check的全局配置,关闭默认的结果输出。在你的测试命名空间中添加如下代码:
(ns tst.tupelo.y64 (:require [clojure.test.check :as tc] [clojure.test.check.clojure-test :as ct] [clojure.test.check.properties :as prop])) ;; 关闭test.check的测试结果打印 (alter-var-root #'tc/print-test-results? (constantly false)) ;; 正常定义你的defspec测试 (ct/defspec dospec-line-44 999 (prop/for-all [x gen/int] (= x x)))
自定义defspec包装器(局部控制)
如果不想全局禁用输出,可自定义一个包装宏,在运行单个测试时捕获或丢弃输出:
捕获输出(不打印)
(defmacro my-defspec [name num-tests & body] `(ct/defspec ~name ~num-tests (with-out-str ~@body)))
使用时替换ct/defspec为my-defspec即可:
(my-defspec dospec-line-53 999 (prop/for-all [x gen/string-alphanumeric] (string? x)))
彻底丢弃输出
如果不需要保留输出内容,可将输出导向空流:
(defmacro my-defspec [name num-tests & body] `(ct/defspec ~name ~num-tests (binding [*out* (clojure.java.io/writer (clojure.java.io/null-output-stream))] ~@body)))
精细过滤输出(进阶)
若需要保留部分输出,可自定义输出流过滤test.check的结果内容。比如编写一个包装流,检测到输出为test.check的结果map时跳过写入,这种方式适合需要精细控制日志的场景,但实现相对复杂。
内容的提问来源于stack exchange,提问作者Alan Thompson
相关产品推荐
相关产品推荐

