在日常的測試工作中,從理論上來說,乙個介面方法可以用乙個用例就搞定測試,然後傳入不同的引數的不同組合,在用例方法裡做不同的分支判斷校驗。看似很美好,包羅永珍的引數組合,實現其來很麻煩,且有如下缺點:
且需要花大量的精力去判斷分支路徑,並做不同的斷言,破壞了方法的原子性,不要指望乙個方法幹所有事情,我們一直強調模組化程式設計。
指令碼存在大量的if-else分支,for迴圈等,指令碼可讀性差 維護成本高。
測試沒有側重點。
那麼,有什麼好的方法來避免這個問題呢?首先,我們要明白為什麼要做資料驅動,資料驅動的原則是什麼?這個問題,相同字段,輸入不同的資料,通過調取被測**,獲取不同的測試結果。每組資料都是相同的字段,進一步可以把一組引數抽象為乙個物件,這一組引數組合就是這個物件的不同元素。我們要做的工作就是不斷建立這樣的物件,並傳遞給測試方法。那麼資料驅動怎麼做呢?有哪些資料驅動方式呢?一般來說,主要有以下幾種方式傳入資料:
以硬編碼的方式寫在**裡,簡單直觀,但**和資料未分離,不方便以後維護。
從檔案讀取資料,如csv,excel、txt、xml等格式檔案。不用修改測試邏輯,只需要維護測試資料。
直接呼叫介面獲取資料源。
本地封裝一些生成資料的方法。
以上幾種方式生成的資料,在@dataprovider方法中以object二位陣列返回資料,測試用例可以直接獲取。通過@datapovider方法資料驅動有以下幾點優點:
1.像在迴圈裡一樣,自動遍歷所有資料組合
2.某一組資料執行測試方法失敗,不會影響其他資料組合繼續執行。
3.測試**不用加過多的資料判斷,要的只是對被測**的資料輸出和結果斷言。
例如要測試乙個列表查詢的介面,有很多查詢條件,那麼需要測試,預設查詢、單一條件查詢、組合條件查詢等場景,其實就是設定不同的查詢引數,其餘測試步驟及校驗大抵相同。
1.單一條件查詢,遍歷所有查詢條件,傳入測試方法,資料的獲取需要封裝成合適的方法,可讀性好,例如這裡buildqueryparmgroup方法就是封裝構造查詢引數的方法
private static map, string> buildqueryparmgroup()
@dataprovider(name = "queryparamproperties")組合條件查詢,隨機生成引數組合,查詢條件放到乙個map裡,封裝乙個buildqueryparmsubmap方法用於隨機生成查詢條件組合,返回乙個map《條件引數名,條件引數值》public static object queryparamproperties() ;
} return objects;
} @test(dataprovider = "queryparamproperties")
@description(description = "
單一條件查詢砍價列表
") public void
testgetbybargainlist_2(map.entry, string> entry) throws exception
if (!(value instanceof string))
if (((string) value).trim().equals(""))
dateformat df = new ******dateformat(promoconstant.yyyymmddhhmmss
);try catch (parseexception e)
}}, date.class);
bargainqueryparm queryparam = new bargainqueryparm();
beanutils.setproperty(queryparam, entry.getkey(), entry.getvalue());
resultbargainlist = this.invoke(bargainreadservice
, "getbargainlist"
, list.class,
clientinfo
, queryparam);
assert.asserttrue(bargainlist.issuccess());
}
private static map, string> buildqueryparmsubmap(map, string> map, int size)資料驅動方法:return submap;
}
@dataprovider(name = "queryparmgroup")public static object queryparmgroup() ;
} return objects;
}
@test(dataprovider = "queryparmgroup")@description(description = "
組合條件查詢砍價列表
")public void
testgetbybargainlist_3(map, string> map) throws exception
if (!(value instanceof string))
if (((string) value).trim().equals(""))
dateformat df = new ******dateformat(promoconstant.yyyymmddhhmmss
);try catch (parseexception e)
}}, date.class);
bargainqueryparm queryparam = new bargainqueryparm();
beanutils.populate(queryparam, map);
resultgetbargainlist = this.invoke(bargainreadservice
, "getbargainlist"
, list.class,
clientinfo
, queryparam);
assert.asserttrue(getbargainlist.issuccess());
}
資料驅動自動化測試
傳統測試認為功能測試 黑盒測試 就是資料驅動測試,而在自動化測試體系中,資料驅動測試則有了新的詮釋。以乙個基礎的自動化框架為例,它可以分為三層設計,資料層 邏輯層 業務層,假設資料層的設計足夠抽象,即可實現多套測試資料執行同樣的測試 邏輯 另一方面從功能測試的角度理解,這種設計同樣可以完成多角度測試...
python 資料驅動自動化測試指令碼
class db con sql 資料庫連線類 def db con config 資料庫連線引數配置 ipadderss user passwd port 33306 return ipadderss,user,passwd,port 資料庫訪問連線 def con get account try...
Python 自動化測試 四 資料驅動
在實際的測試工作中,通常需要對多組不同的輸入資料,進行同樣的測試操作步驟,以驗證我們的軟體質量。這種測試,在功能測試中非常耗費人力物力,但是在自動化中,卻比較好實現,只要實現了測試操作步驟,然後將多組測試資料以資料驅動的形式注入,就可以實現了。前面文章學習了引數化,當資料量非常大的時候,我們可以將資...