自動化テストでよく使用されるデータ駆動方式

17929 ワード

日常のテストの仕事の中で、理論的に言えば、1つのインタフェースの方法は1つの用例でテストを完成することができて、それから異なるパラメータの異なる組み合わせに入って、用例の方法の中で異なる分岐判断の検査をします.美しく見えますが、万象を網羅したパラメータの組み合わせは、実現するのが面倒で、次のような欠点があります.
  • では、分岐経路を判断するのに多くの精力を費やし、異なる断言を行い、方法の原子性を破壊し、一つの方法ですべてのことをすることを期待しないで、モジュール化プログラミングを強調してきました.
  • スクリプトにはif-elseブランチが大量に存在し,forループなどがあり,スクリプトの可読性が悪くメンテナンスコストが高い.
  • テストには重点がありません.

  • では、この問題を避けるにはどんな良い方法がありますか.まず、なぜデータ駆動をするのか、データ駆動の原則は何なのかを理解しなければなりません.この問題は,同じフィールドに異なるデータを入力し,被測定コードを呼び出して異なるテスト結果を取得する.各グループのデータは同じフィールドであり、さらにパラメータのセットをオブジェクトとして抽象化することができます.このパラメータのセットは、このオブジェクトの異なる要素です.私たちがしなければならない仕事は、このようなオブジェクトを絶えず作成し、テスト方法に渡すことです.では、データドライバはどうすればいいのでしょうか.どのようなデータ駆動方式がありますか?一般的には、主に次の方法でデータを転送します.
  • はハードコーディングでコードに書かれていて、簡単で直感的ですが、コードとデータは分離されておらず、後でメンテナンスするのに不便です.
  • csv,excel,txt,xmlなどのフォーマットファイルからデータを読み出す.テストロジックを変更する必要はありません.テストデータを維持するだけです.
  • は、インタフェースを直接呼び出してデータソースを取得する.
  • は、データを生成する方法をローカルにカプセル化する.

  • 以上のように生成されたデータは,@DataProviderメソッドでObject 2ビット配列で返され,テスト用例は直接取得できる.@datapoviderメソッドによるデータ駆動には、以下の利点があります.
    1.ループ内のように、すべてのデータの組合せを自動的に巡回する
    2.データのセットのテスト方法が失敗し、他のデータの組み合わせの継続に影響しません.
    3.テストコードはあまりデータ判断を加えなくても、被測定コードのデータ出力と結果の断言だけが必要です.
    たとえば、リストクエリーのインタフェースをテストするには、クエリー条件がたくさんあるので、テストが必要です.デフォルトクエリー、単一条件クエリー、組合せ条件クエリーなどのシーンは、実際には異なるクエリーパラメータを設定し、残りのテストステップとチェックはほぼ同じです.
    1.単一条件クエリー、すべてのクエリー条件を遍歴し、テスト方法を入力し、データの取得は適切な方法にカプセル化する必要があり、可読性が良い.例えば、ここでbuildQueryParmGroup方法はクエリーパラメータをカプセル化する方法である.
    private static Map, String> buildQueryParmGroup() {
        HashMap, String> map = new HashMap, String>();
        map.put("id", "1003266");
        map.put("type", "1");
        map.put("venderId", "20032");
        map.put("businessId", "100073920");
        map.put("title", " api ");
        map.put("skuId", "1200039810");
        map.put("oneCategory", "1315");
        map.put("twoCategory", "1342");
        map.put("threeCategory", "9733");
        map.put("beginTime", "2017-01-04 16:19:45");
        map.put("endTime", "2017-02-03 16:19:45");
        map.put("status", "1");
        map.put("pin", "test_sop01");
        map.put("customerPin", "sop_order_new");
        return map;
    }
      @DataProvider(name = "queryParamProperties")
        public static Object[][] queryParamProperties() {
            Map, String> queryParmGroup = buildQueryParmGroup();
            Set, String>> entrySet = queryParmGroup.entrySet();
            Object[][] objects = new Object[entrySet.size()][];
            Object[] objects1 = entrySet.toArray();
            for (int i = 0; i < objects.length; i++) {
                objects[i] = new Object[]{objects1[i]};
            }
    
            return objects;
        }
    
        @Test(dataProvider = "queryParamProperties")
        @Description(description = " ")
        public void testGetByBargainList_2(Map.Entry, String> entry) throws Exception {
    //        ConvertUtils.register(new DateLocaleConverter(), Date.class);
            ConvertUtils.register(new Converter() {
                public Object convert(Class type, Object value) {
                    if (value == null) {
                        return null;
                    }
                    if (!(value instanceof String)) {
                        throw new ConversionException(" ");
                    }
                    if (((String) value).trim().equals("")) {
                        return null;
                    }
                    DateFormat df = new SimpleDateFormat(PromoConstant.YYYYMMDDHHMMSS);
                    try {
                        return df.parse((String) value);
                    } catch (ParseException e) {
                        throw new RuntimeException(e);
                    }
    
                }
            }, Date.class);
            BargainQueryParm queryParam = new BargainQueryParm();
            BeanUtils.setProperty(queryParam, entry.getKey(), entry.getValue());
    
            Result bargainList = this.invoke(bargainReadService, "getBargainList", List.class, clientInfo, queryParam);
            Assert.assertTrue(bargainList.isSuccess());
        }
    条件クエリーを組み合わせて、ランダムにパラメータの組み合わせを生成して、クエリーの条件は1つのmapの中に置いて、1つのbuildQueryParmSubMap方法をカプセル化してランダムにクエリーの条件の組み合わせを生成して、1つのmapを返します
    private static Map, String> buildQueryParmSubMap(Map, String> map, int size) {
        Set, String>> entries = map.entrySet();
    
        ImmutableSet, String>> subSet = ImmutableSet.copyOf(Iterables.limit(entries, size));
        Map, String> subMap = new HashMap, String>();
        Iterator, String>> iterator = subSet.iterator();
        while (iterator.hasNext()) {
            Map.Entry, String> entry = iterator.next();
            subMap.put(entry.getKey(), entry.getValue());
        }
    
        return subMap;
    }
    データ駆動方法:
    @DataProvider(name = "queryParmGroup")
    public static Object[][] queryParmGroup() {
        Map, String> queryParmGroup = buildQueryParmGroup();
        Object[][] objects = new Object[100][];
        for (int i = 0; i < objects.length; i++) {
            objects[i] = new Object[]{buildQueryParmSubMap(queryParmGroup, RandomUtils.nextInt(queryParmGroup.size()))};
    
        }
    
        return objects;
    
    }
    @Test(dataProvider = "queryParmGroup")
    @Description(description = " ")
    public void testGetByBargainList_3(Map, String> map) throws Exception {
        ConvertUtils.register(new Converter() {
            public Object convert(Class type, Object value) {
                if (value == null) {
                    return null;
                }
                if (!(value instanceof String)) {
                    throw new ConversionException(" ");
                }
                if (((String) value).trim().equals("")) {
                    return null;
                }
                DateFormat df = new SimpleDateFormat(PromoConstant.YYYYMMDDHHMMSS);
                try {
                    return df.parse((String) value);
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
    
            }
        }, Date.class);
        BargainQueryParm queryParam = new BargainQueryParm();
        BeanUtils.populate(queryParam, map);
    
        Result getBargainList = this.invoke(bargainReadService, "getBargainList", List.class, clientInfo, queryParam);
        Assert.assertTrue(getBargainList.isSuccess());
    }