我如何期望单元测试失败?

时间:2011-10-21 15:59:04

标签: unit-testing clojure

我们正在使用clojure.test在Clojure中为我们的代码编写单元测试。

我们的一些测试会忽略API并故意破坏代码,以便作为代码中潜在缺陷的文档。

但是,我们希望区分这些测试的失败和正常测试的失败。

我们在clojure.test文档中没有看到任何建议 - 仅(is (thrown? ...)),这当然不能满足我们的需求。

有什么建议吗?基本上,我们正在寻找像(is (not <condition>))这样的东西,除了测试框架应该记录预期的失败 - 类似于this

4 个答案:

答案 0 :(得分:3)

我已经让测试在这样“失败”时抛出异常,然后使用thrown?来测试异常是否按预期到达。很可能存在一种更优雅的方式,但这可以完成工作。

答案 1 :(得分:3)

正如@andy所说,你可以重新绑定report功能。

(defmacro should-fail [body]
  `(let [report-type# (atom nil)]
     (binding [clojure.test/report #(reset! report-type# (:type %))]
       ~body)
     (testing "should fail"
       (is (= @report-type# :fail )))))

并像这样使用这个宏:

(should-fail (is (= 1 2)))

这将成功通过测试。

答案 2 :(得分:0)

重新绑定报告功能,如clojure.test中所述。从那里你可以改变如何处理和报告'失败'。

答案 3 :(得分:0)

我知道,派对有点晚了,但是如果你使用Leiningen,你可以使用测试选择器从“正常”版本中排除预期的失败。在你的project.clj中:

:test-selectors {:default #(not :expected-failure %)
                 :expected-failure :expected-failure}

然后将您的测试编写为:

(deftest ^:expected-failure test-with-expected-failure ...)

调用lein test将仅运行那些没有:expected-failure元数据的测试。调用lein test :expected-failure将运行您预期的失败测试。也许并不是你所希望的,但恕我直言,比在整个地方使用thrown?更好。至少这种预期的失败在代码中明确记录,不会干扰构建。