2

Web アプリ用の UI テストを作成しようとしていますが、いくつかの複雑な問題があり、解決に役立てていただければ幸いです。

まず、アプリには 2 つのモードがあります。モードの 1 つは「トレーニング」で、もう 1 つは「ライブ」です。ライブ モードでは、データはデータベースから直接取得され、テストによって加えられた変更はすべてデータベースに反映されます。「ライブ」で各テストを実行する前に、毎回異なるテスト データを生成する必要があります (そのロジックは既にあります)。所定の位置に)。トレーニング モードでは、すべてのデータが静的であるため、毎回同じテスト データが使用されます。

UI は各モードで同じなので、各モードに対して 1 回テストを実行したいのですが、特定の特性により、一部のテストはライブ モードでしか実行できません。

理想的には、テストを UserTests、PaymentTests、LiveOnlyTests などのいくつかのクラスに分割し、テスト データを提供する 2 つの異なるクラス (共通インターフェイスを拡張) を用意します。

次に、これらの部分から、各モードに 1 つずつ、2 つの異なるテスト スイートを作成したいと思います。テスト スイートは、私が渡したデータを含むオブジェクトを受け入れ、テストを実行します。

これまたは同様の効果を達成する何かがJUnit(またはその他のJavaテストフレームワーク)で実行できるかどうかは誰にもわかりません。これが完了したことを確認できる唯一の方法は、独自のテスト ランナーを作成することですが、それは避けたいと思います。

前もって感謝します。

4

1 に答える 1

2

私がすることは、ParameterizedAssumeの組み合わせを見ることです。

パラメーター化により、テスト用の一連のテスト データを定義できます。(おそらくシステム プロパティに基づいて) トレーニング/ライブのデータ セットを返すことができます。

Assume を使用すると、何かをテストできます。仮定が偽の場合は、テストを中止します (失敗ではなく、失敗した仮定で)。

Categoriesを使用することもできますが、2 つのランナーを結合する必要があるため、パラメーター化された状態で実行するのは困難です。

したがって、パラメータ化されたと仮定すると、次のようになります。

@RunWith(Parameterized.class)
 public class MyTest {
  @Parameters
  public static List<Object[]> data() {
    // return different data, depending upon the value of System.getProperty("testType");
    return Arrays.asList(new Object[][] {
      { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
    });
  }

  private int fInput;
  private int fExpected;

  public MyTest(int input, int expected) {
    fInput= input;
    fExpected= expected;
  }

  @Test
  public void testTraining() {
    Assume("training".equals(System.getProperty("testType"));

    // test which only runs for training, using the data from data()
  }

  @Test
  public void testBoth() {
    // test which only runs for both, using the data from data()
  }
 }

上記のいくつかの組み合わせで、おそらくあなたが望むものを手に入れることができます。

于 2012-09-09T09:45:06.657 に答える