自動化テストでよく使用されるデータ駆動方式
17929 ワード
日常のテストの仕事の中で、理論的に言えば、1つのインタフェースの方法は1つの用例でテストを完成することができて、それから異なるパラメータの異なる組み合わせに入って、用例の方法の中で異なる分岐判断の検査をします.美しく見えますが、万象を網羅したパラメータの組み合わせは、実現するのが面倒で、次のような欠点があります.では、分岐経路を判断するのに多くの精力を費やし、異なる断言を行い、方法の原子性を破壊し、一つの方法ですべてのことをすることを期待しないで、モジュール化プログラミングを強調してきました. スクリプトにはif-elseブランチが大量に存在し,forループなどがあり,スクリプトの可読性が悪くメンテナンスコストが高い. テストには重点がありません.
では、この問題を避けるにはどんな良い方法がありますか.まず、なぜデータ駆動をするのか、データ駆動の原則は何なのかを理解しなければなりません.この問題は,同じフィールドに異なるデータを入力し,被測定コードを呼び出して異なるテスト結果を取得する.各グループのデータは同じフィールドであり、さらにパラメータのセットをオブジェクトとして抽象化することができます.このパラメータのセットは、このオブジェクトの異なる要素です.私たちがしなければならない仕事は、このようなオブジェクトを絶えず作成し、テスト方法に渡すことです.では、データドライバはどうすればいいのでしょうか.どのようなデータ駆動方式がありますか?一般的には、主に次の方法でデータを転送します.はハードコーディングでコードに書かれていて、簡単で直感的ですが、コードとデータは分離されておらず、後でメンテナンスするのに不便です. csv,excel,txt,xmlなどのフォーマットファイルからデータを読み出す.テストロジックを変更する必要はありません.テストデータを維持するだけです. は、インタフェースを直接呼び出してデータソースを取得する. は、データを生成する方法をローカルにカプセル化する.
以上のように生成されたデータは,@DataProviderメソッドでObject 2ビット配列で返され,テスト用例は直接取得できる.@datapoviderメソッドによるデータ駆動には、以下の利点があります.
1.ループ内のように、すべてのデータの組合せを自動的に巡回する
2.データのセットのテスト方法が失敗し、他のデータの組み合わせの継続に影響しません.
3.テストコードはあまりデータ判断を加えなくても、被測定コードのデータ出力と結果の断言だけが必要です.
たとえば、リストクエリーのインタフェースをテストするには、クエリー条件がたくさんあるので、テストが必要です.デフォルトクエリー、単一条件クエリー、組合せ条件クエリーなどのシーンは、実際には異なるクエリーパラメータを設定し、残りのテストステップとチェックはほぼ同じです.
1.単一条件クエリー、すべてのクエリー条件を遍歴し、テスト方法を入力し、データの取得は適切な方法にカプセル化する必要があり、可読性が良い.例えば、ここでbuildQueryParmGroup方法はクエリーパラメータをカプセル化する方法である.
では、この問題を避けるにはどんな良い方法がありますか.まず、なぜデータ駆動をするのか、データ駆動の原則は何なのかを理解しなければなりません.この問題は,同じフィールドに異なるデータを入力し,被測定コードを呼び出して異なるテスト結果を取得する.各グループのデータは同じフィールドであり、さらにパラメータのセットをオブジェクトとして抽象化することができます.このパラメータのセットは、このオブジェクトの異なる要素です.私たちがしなければならない仕事は、このようなオブジェクトを絶えず作成し、テスト方法に渡すことです.では、データドライバはどうすればいいのでしょうか.どのようなデータ駆動方式がありますか?一般的には、主に次の方法でデータを転送します.
以上のように生成されたデータは,@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());
}