【问题标题】:How do I expect failure in a unit test?我如何期望单元测试失败?
【发布时间】:2011-10-21 15:59:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 当你说“测试框架应该记录一个预期的失败”时,你的意思是测试框架应该认识到测试通过了,因为它抛出了你预期的异常,还是你的意思是它应该认识到三种输出结果:通过、失败和预期失败,后者明确记录?
  • @user100464:类似这样的:docs.python.org/library/…。所以我们想明确记录预期的失败。

标签: unit-testing clojure


【解决方案1】:

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

【讨论】:

  • 是的,我担心这可能是最简单的方法。
【解决方案2】:

正如@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)))

那将成功通过测试。

【讨论】:

    【解决方案3】:

    重新绑定 clojure.test 中记录的报告函数。从那里您可以更改“失败”的处理和报告方式。

    【讨论】:

      【解决方案4】:

      聚会有点晚了,我知道,但如果您使用 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? 更好。至少这种方式预期的失败会在代码中明确记录,并且不会干扰构建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多