web-dev-qa-db-ja.com

JUnit理論とパラメーター化されたテストの違い

理論とパラメーター化されたテストの違いは何ですか?

テストクラスを作成するときは、実装の違いには興味がありません。どちらか一方を選択するときだけです。

59
dogbane

私の理解から:パラメータ化されたテストを使用すると、一連の静的入力をテストケースに提供できます。

理論は似ていますが、概念が異なります。それらの背後にある考え方は、静的な値ではなく仮定でテストするテストケースを作成することです。したがって、提供されたテストデータがいくつかの仮定に従って真である場合、結果のアサーションは常に確定的です。この背後にある原動力となるアイデアの1つは、無制限の数のテストデータを提供でき、テストケースが依然として真であることです。また、多くの場合、負の数値など、テスト入力データ内の可能性の範囲をテストする必要があります。静的にテストする場合、つまり、いくつかの負の数を指定する場合、たとえその可能性が非常に高いとしても、コンポーネントがすべての負の数に対して機能することは保証されません。

私が言えることから、xUnitフレームワークは、提供されたテストデータのすべての可能な組み合わせを作成することにより、理論の概念を適用しようとします。

データ駆動型シナリオのシナリオにアプローチする場合は、両方を使用する必要があります(つまり、入力のみが変更されますが、テストは常に同じアサーションを繰り返し実行しています)。

しかし、理論は実験的なものであるため、入力データの一連の組み合わせをテストする必要がある場合にのみ理論を使用します。他のすべてのケースでは、パラメーター化されたテストを使用します。

28
Fabio Kenji

Parameterized.classは "parametrize"を単一の変数でテストし、Theories.class "parametrize"は複数の変数のすべての組み合わせをテストします。

例を読んでください:

http://blogs.Oracle.com/jacobc/entry/parameterized_unit_tests_with_junit

http://blog.schauderhaft.de/2010/02/07/junit-theories/

http://blogs.Oracle.com/jacobc/entry/junit_theories

Theories.classはHaskell QuickCheckに似ています:

http://en.wikibooks.org/wiki/Haskell/Testing

しかしQuickCheckはパラメータの組み合わせを自動生成します

11
gliptak

上記の応答に加えて:4つの値と2つのテストメソッドを持つ入力

  • @RunWith(Theories.class)-2つのJUnitテストを生成します

  • @RunWith(Parameterized.class)-8(4入力x 2メソッド)JUnitテストを生成します

0
andreyro

私の理解からの違いは、パラメーター化されたテストは異なる入力のセットをテストする場合に使用されることです(それぞれを個別にテストします)。理論は、すべての入力を次のようにテストするパラメーター化されたテストの特別なケースです。全体(すべてのパラメーターがtrueである必要があります)。

0
Ricardo Gomes

返信が少し遅れました。しかし、それは将来のテスターに​​役立つでしょう。

パラメータ化されたテストvs理論

  • 「@RunWith(Parameterized.class)」と注釈が付けられたクラスVS「@RunWith(Theories.class)」
  • テスト入力は、Collectionを返す静的メソッドから取得され、@ Parametersと@DataPointsまたは@DataPointで注釈が付けられた静的フィールドで注釈が付けられます。
  • 入力はコンストラクターに渡され(必須)、テストメソッドで使用されます。入力はテストメソッドに直接渡されます。
  • テストメソッドには@Testの注釈が付けられ、引数を取りませんvsテストメソッドには@Theoryの注釈が付けられ、引数を取る場合があります
0
VHS