2

さまざまな方法で提示できる列挙型があります。String、Integer、Double (異なる範囲)、Vector2D、最後に列挙値自体として。これは一般化された例であり、値は代表的なものではありません。私がこれを実際に使用しているのは、はるかに多くの値とメソッドがあります。

 public enum Example {

    value0("Name0", 0, 0.0, 0.01707, 0.12534);        
    value1("Name1", 1, 25.0, 0.1707, 0.53434);
    value2("Name2", 2, 55.0, 0.70701, 0.23534);
    value3("Name3", 3, 65.0, 0.01707, 0.34786);
    value5("Name4", 4, 100.0, 0.01707, 0.42594);

    private final String name;
    private final int number; 
    private final double head;
    private final Vector2d pointVec;

    /**
     * Constructor invoked for each value above. 
     */
    enumExample(String name, int no, double hdg, float compX, float CompY) {
      this.name = name;
      this.number = no;
      this.head = hdg;
      this.pointVec = new Vector2d(compX, compY);
    }

    public String getName(){
       return name;        
    }

    public int getNumber() {
        return no;
    }

    public int getHead() {
        return head;
    }

    public Vector2D getVector() {
        return pointVec;
    }        

    public Example getCalcValue(int value) {
        return calcValue(getNumber(value));
    }

    /*
     * There are more methods that perform calculations on the enum's 
     * attributes.
     */
 }

この列挙型を使用する他のクラスが正しく機能する列挙型で動作していることを確認するため。そのための包括的なテストセットを用意して、データ入力が正しく実行され、列挙型とそれに関連するデータが破損していないことを確認したいと考えています。

現在、5 つの列挙値を持つこの例には、31 のテストがあります。これのバージョンが最大 33 の列挙値になる必要があります。これは約200のテストです。

これにより、テストデータを目で簡単に確認できるようになるため、データ駆動型テストを使用できるようになることを望んでいました。

これを列挙型に設定する方法について誰か考えがありますか? 私が見つけたデータ駆動型テストのすべての例には、テストするメソッドが 1 つある単純なクラスがあります。

4

4 に答える 4

2

パラメータ化されたテストは、考えられる最も美しいコードではありません (object[] 全体は好きではありません) が、おそらくそれらを使用して自分の作業を行うことができます... この例では、期待される結果を持つ 2 つのテストがあります。ですが、もちろん、すべてのテストで列挙型の特定の部分をテストして、複数のテストに多くのパラメーターを追加できます。

@RunWith(Parameterized.class)
public class SomeTest {

    @Parameters
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { 
                 { MyEnum.Value1, 0, "x" }, 
                 { MyEnum.Value2, 1, null }, 
                 { MyEnum.Value3, 127, "y" }, 
                 etc.
           });
    }

    private MyEnum enumValue;
    private int expectedInt;
    private String expectedString;

    // Each test set will get one set of parameters from your array
    public SomeTest(MyEnum enumValue, int expectedInt, String expectedString) {
        this.enumValue = enumValue;
        this.expectedInt = expectedInt;
        this.expectedString = expectedString;
    }

    @Test
    public void testInt() {
         // do whatever calculation you need to do on the data
         int result = this.enumValue.doSomething() * 2 - 100;  
         assertEquals(expectedInt, result);
    }

    @Test
    public void testString() {
         // do whatever calculation you need to do on the data
         String result = this.enumValue.doSomethingElse().substring(2,5);
         assertEquals(expectedString, result);
    }
}

この方法では、enum 自体に対して 1 セットのテストのみを記述し、実際の enum 値とこれらの値の期待される結果でそれらをパラメーター化します。

値をチェックするだけでなく、テストクラスで実際の計算を行うことをお勧めします。値をチェックすると、人々が値をコピーしてテストに貼り付けることにつながり、誰も役に立たないからです。

于 2015-10-20T08:04:11.710 に答える
0

データ入力が正しく実行されたことを確認したい場合は、各列挙型を個別にテストしないでください。無意味です。パラメータ化されたテストでは非常に簡単ですが、本番コードのコピーだけになってしまいます。

test(enum0, "Name0", 0, 0.0, 0.01707, 0.12534)
test(enum1, "Name1", 1, 25.0, 0.1707, 0.53434)

不正なデータ入力を防ぐことはできません。コード変更プロセスが長くなるだけです(重複のため)。誰かが間違ったデータを入力すると、それらをコピーしてテストに貼り付けます

代わりに、必要なすべてのプロパティが保持されているかどうかを確認してください。たとえば、すべての値は異なっていなければならず、重複してはならず、均等に分散されている必要があり、後続の値があるなどです。他のコードが列挙型にどのように反応するかを確認してください。たとえば、メソッドがすべての列挙型を受け取った場合に、すべての可能なイベントが発生する場合です。

このようにして、誰かが列挙型を変更しても、テストは変更されません。ある程度、不正なデータを検出できます

于 2015-10-25T10:59:23.817 に答える