3

JunitTestNGはどちらも、入力パラメーターのコレクションを反復処理し、それらに対してテストを実行するためのメカニズムを提供します。Junit では、これはParameterized アノテーションを介してサポートされますが、TestNG は@DataProviderを使用します。

test-isライブラリを使用してデータ駆動型テストを作成するにはどうすればよいですか? リスト内包表記を使用して入力パラメーター コレクションを反復処理しようとしましたが、 deftestはマクロであるため、それ句を期待しています。

4

2 に答える 2

8

Junit のパラメーター化されたテストに関する記事を読むと、ポイラー プレートを通過すると、パラメーター化のクールな部分は、次のように入力できるようになることです。

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

4 つのテストを簡単に定義できます。

in test-is は同等です (定型コードは不要です) マクロはare

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

入力をマップとして渡したい場合は、次のように実行できます。

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

ただし、areマクロはより読みやすい出力を生成します。

于 2009-12-08T19:31:48.837 に答える
3

パラメーター化されたテストのポイントを理解しているかどうかはわかりませんが、これには動的バインディングを使用します。

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 を数十行ほど使用する必要があります。

于 2009-12-08T19:45:36.713 に答える