Testing “你怎么能这样?”;“参数化”;Clojure Contrib';考试是什么?

Testing “你怎么能这样?”;“参数化”;Clojure Contrib';考试是什么?,testing,clojure,clojure-contrib,test-is,Testing,Clojure,Clojure Contrib,Test Is,和都提供了在输入参数集合上迭代并对其运行测试的机制。在Junit中,这是通过支持的,而TestNG使用@DataProvider 如何使用test is库编写数据驱动测试?我尝试使用for列表理解来迭代输入参数集合,但是因为deftest是一个宏,所以它需要is子句。从Junit中有关参数化测试的文章中可以看出,一旦您通过了poiler板块,参数化的酷之处在于它允许您键入以下内容: return Arrays.asList(new Object[][] { {

和都提供了在输入参数集合上迭代并对其运行测试的机制。在Junit中,这是通过支持的,而TestNG使用@DataProvider


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

从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
宏将生成更易于读取的输出

我不确定我是否理解参数化测试的意义,但我会为此使用动态绑定

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
user>(定义*测试数据*[01 2 3 4 5])
#'用户/*测试数据*
用户>(deftest foo)
(doseq[x*测试数据*]
(是((运行测试)
测试用户
失败(foo)(无源文件:1)
预期:((defn使用数据[数据]运行测试)
(绑定[*测试数据*数据](运行测试)))
#'用户/使用数据运行测试
用户>(使用数据[0 1 2 3]运行测试)
测试用户
运行了1个包含4个断言的测试。
0次失败,0次错误。
无
您可以自己重写
deftest
运行测试。可能需要十几行Clojure才能让测试以其他方式接受参数