你怎么能“参数化”Clojure Contrib的测试?

时间:2009-12-08 15:37:08

标签: testing clojure clojure-contrib test-is

JunitTestNG都提供了迭代输入参数集合并针对它们运行测试的机制。在Junit中,这是通过Parameterized annotation支持的,而TestNG则使用 @DataProvider

如何使用 test-is 库编写数据驱动的测试?我尝试使用 for 列表推导来迭代输入参数集合,但因为 deftest 是一个宏,所以它期望子句。

2 个答案:

答案 0 :(得分:8)

从阅读有关Junit中参数化测试的文章看来,一旦你越过了poiler板,参数化的一个很酷的部分就是它可以让你输入:

      return Arrays.asList(new Object[][] {
            { 2, true },
            { 6, false },
            { 19, true },
            { 22, false }

并轻松定义四个测试。

测试中的

是等效的(不需要样板代码)宏是are

(are [n prime?] (= prime? (is-prime n))  
     3 true
     8 false)

如果您想将输入作为地图提供,那么您可以运行以下内容:

(dorun (map #(is (= %2 (is-prime %1)) 
            { 3 true, 8 false}))

尽管are宏会产生更容易读取的输出。

答案 1 :(得分:2)

不确定我理解参数化测试的要点,但我会使用动态绑定。

user> (def *test-data* [0 1 2 3 4 5])
#'user/*test-data*

user> (deftest foo
        (doseq [x *test-data*]
           (is (< x 4))))
#'user/foo
user> (run-tests)

Testing user

FAIL in (foo) (NO_SOURCE_FILE:1)
expected: (< x 4)
  actual: (not (< 4 4))

FAIL in (foo) (NO_SOURCE_FILE:1)
expected: (< x 4)
  actual: (not (< 5 4))

Ran 1 tests containing 6 assertions.
2 failures, 0 errors.
nil

user> (defn run-tests-with-data [data]
        (binding [*test-data* data] (run-tests)))
#'user/run-tests-with-data

user> (run-tests-with-data [0 1 2 3])

Testing user

Ran 1 tests containing 4 assertions.
0 failures, 0 errors.
nil

您可以自己重写deftestrun-tests。它可能是十几行Clojure让测试以其他方式接受参数。