两个Junit和TestNG循环遍历的输入参数集合,对他们的运行测试的机制。在Junit中,通过Parameterized annotation支持,而TestNG使用@DataProvider。你如何“参数化”Clojure Contrib的测试?
如何使用测试库库编写数据驱动的测试?我尝试使用为列表理解迭代输入参数集合,但因为deftest是一个宏它期望是子句。
两个Junit和TestNG循环遍历的输入参数集合,对他们的运行测试的机制。在Junit中,通过Parameterized annotation支持,而TestNG使用@DataProvider。你如何“参数化”Clojure Contrib的测试?
如何使用测试库库编写数据驱动的测试?我尝试使用为列表理解迭代输入参数集合,但因为deftest是一个宏它期望是子句。
从阅读在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
你可以重写deftest
和run-tests
自己。这可能是十几行Clojure让测试接受其他方式的参数。