基于testNG的数据驱动测试的自动化测试实践(一)
歷時4個月,從搭建測試框架到給全員培訓,再到最終團隊內落地,最終效果是整個團隊QA測試階段效率提升60%多。既然有數據就有衡量標準,統計了近2個月的開發階段/測試階段的耗時比,比如自動化前,開發階段/測試階段耗時比2:1,如今達到5.3:1,簡單說開發5人天,測試原來花費2.5人天,現在花費1人天,當然這是平均值。這不僅是單單自動化測試框架的搭建,還需要配合管理手段,如何將自動化測試不單單用于回歸測試而是整個QA測試,何時寫用例?何時寫腳本?何時執行腳本?如何維護腳本?如何給全員培訓?(大家代碼基礎很薄弱,降低學習成本,快速上手很關鍵)這一整套的配合才能更好的將自動化測試落地。
整個自動化測試框架搭建經歷了2個階段。
第一個階段:從0到1,提高效率,耗時3個月,主要目標是框架分層以及70多個API接口的幾百個場景的覆蓋,效果就是上面提到效率提高60%
第二個階段:核心框架重構和API接口遷移,耗時1個月,主要目標是降低維護和學習成本,通過1,2次培訓,可以上手做自動化測試。同時將被測的API接口遷移至新的框架,最終代碼量降低了90%,腳本執行時間提高了95%。
框架的作用?
把自動化測試框架比喻成搭積木吧,核心框架的搭建,工具類的封裝類似于積木塊,按照一定規則寫符合各業務需求的用例腳本類似于搭積木,搭積木學習成本較低,只要培訓就能上手,按照工具類的方法正確使用,按照框架的層級要求正確拼裝,可以使整個團隊內自動化測試快速落地。
- 積木塊:
分層大致是 ? ?java--base包 ? ? 作用:獲取接口信息并調用接口,ps:具體的接口地址,名稱,基礎入參存儲于數據庫里
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --driver包 ? 作用:工具類和selenium驅動,包含入參關鍵詞,接口斷言,數據庫操作等
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --operation包 ? 作用:基于 web driver的UI自動化基礎操作
以上部分由專人維護,根據業務需要不斷補充接口和工具類
- 搭積木
? ? ? ? ? ? ? ? ? ? ? ?test--autocase包--bvt? ?作用:冒煙測試范圍的用例腳本,用于回歸測試
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--api ? ?作用:所有功能測試的用例腳本,用于日常功能測試
這一部分由業務測試人員維護,根據各自負責的需求編寫對應的測試腳本,90%以上覆蓋手工用例。
對于業務人員如何寫腳本呢?以一個BVT級別的腳本為例,測試發紅包-搶紅包-退紅包的場景,整個流程需要6個接口。
腳本分為6步:發紅包-發紅包查詢-搶紅包-搶紅包查詢-退紅包-退紅包查詢。
發紅包分為綁卡支付,余額支付2種,退款紅包又分為原路退回和退回到余額。針對不同的場景,進行組合,會有4種場景,而腳本的流程是相同的,采用testNG的DataProvider可以參數化,只需要增加測試數據,每個測試數據對應一個用例,隨著用例的增加不會顯性增加代碼數量,大多情況下只需要維護好數據即可。
為了更加清晰,測試數據分為3部分{ ?用例名稱,入參,斷言},當然這是比較標準的情況,根據實際接口可以靈活變通。最后腳本如下:
@DataProvider(name = "redpacket_bvt")public Object[][] redpacket_bvt_parm(){return new Object[][]{{"*發紅包-綁卡,搶紅包,原路退回**","BINDCARD","OLDWAY","{'code':'QM000000','message':'受理成功'}"},{"*發紅包-綁卡,搶紅包,退回余額**","BINDCARD","BALANCE","{'code':'QM000000','message':'受理成功'}"},{"*發紅包-余額支付,搶紅包,原路退回**","BALANCE","OLDWAY","{'code':'QM000000','message':'受理成功'}"},{"*發紅包-余額支付,搶紅包,退回余額**","BALANCE","BALANCE","{'code':'QM000000','message':'受理成功'}"},};} /*** 發紅包-搶紅包-退紅包* @throws Exception*/@Test(dataProvider ="redpacket_bvt" )public void redpacket_bvt(String name,String payTool,String refundWay,String assertjson) throws Exception{System.out.println(name);//發紅包String replacejsonA="{'orderAmount':'0.02','merchantUserId':'"+huiyuanA+"','payTool':'"+payTool+"','bindId':'"+A_bindid+"'}";String resultA = YopApiRedpacket.redpacket_consume(merchant,replacejsonA);ToolUtils.AssertEqualfromJson(resultA, assertjson);ToolUtils.AssertExist(resultA, "requestNo,redOrderNo,orderAmount");TimeUnit.SECONDS.sleep(2);//發紅包查詢String replacejsonB="{'sendRequestNo':'"+ToolUtils.getJsonValue(resultA, "requestNo")+"'}";String resultB = YopApiRedpacket.redpacket_order_query(merchant,replacejsonB);ToolUtils.AssertEqualfromJson(resultB, assertjson);ToolUtils.AssertExist(resultB, "total,trxTime,effectiveTime,redOrderNo,state,fromUserNo,lastAmount");//搶紅包String replacejsonC = "{'trxAmount':'0.01','merchantUserId':'"+huiyuanA+"','redOrderNo':'"+ToolUtils.getJsonValue(resultB, "redOrderNo")+"'}";String resultC = YopApiRedpacket.redpacket_grab(merchant,replacejsonC);ToolUtils.AssertEqualfromJson(resultC, assertjson);ToolUtils.AssertExist(resultC, "requestNo,redOrderNo,grabOrderNo");//搶紅包查詢String replacejsonD = "{'grabRequestNo':'"+ToolUtils.getJsonValue(resultC, "requestNo")+"'}";String resultD = YopApiRedpacket.redpacket_grab_query(merchant,replacejsonD);ToolUtils.AssertEqualfromJson(resultD, assertjson);ToolUtils.AssertExist(resultD, "requestNo,redOrderNo,grabOrderNo,amount,ppMerchantNo,toUserNo,status,grabTime");//退紅包String replacejsonE = "{'redOrderNo':'"+ToolUtils.getJsonValue(resultC, "redOrderNo") +"','refundWay':'"+refundWay+"'}";String resultE = YopApiRedpacket.redpacket_refund(merchant, replacejsonE);ToolUtils.AssertEqualfromJson(resultE, assertjson);ToolUtils.AssertExist(resultE, "requestNo,redOrderNo,refundAmount");TimeUnit.SECONDS.sleep(2);String replacejsonF = "{'redOrderNo':'"+ToolUtils.getJsonValue(resultE, "redOrderNo")+"'}";String resultF = YopApiRedpacket.redpacket_refund_query(merchant, replacejsonF);ToolUtils.AssertEqualfromJson(resultF, assertjson);ToolUtils.AssertExist(resultF, "requestNo,redOrderNo,refundWay,ppMerchantNo,refundAmount,merchantUserId,status,createTime,updateTime,refundTime");}入參技巧:
1、保存一組基礎入參,比如一個接口有5個字段,3個必填項,2個非必填。那么3個必填項是基礎入參,存在數據庫里,2個非必填根據用例需要在業務層測試數據傳入。
2、無論是不是必填項,根據用例場景需要變化的入參在業務層傳入,沒有傳入的取自數據庫的基礎入參,這樣可以減少測試數據的維護成本。
3、定義一些關鍵詞,比如隨機數,當前日期等等,看業務需要,作用就不多說了,做過自動化基本都知道。
| @random | 隨機字符串10位 | txt@random = txt1234567890 |
| @date | 當前時間 | @date = yyyy-MM-dd HH:mm:ss |
| @merchant | 所選測試錢麥商編,如1247 | @merchant = BM12345678901247 |
?
4、入參格式:統一json形式傳遞。
{"requestNo":"redf@random","orderAmount":"0.02","merchantOrderDate":"@date","merchantExpireTime":"","serverCallbackUrl":"@serverCallbackUrl","merchantUserId":"qianmai3610","payTool":"BINDCARD","totalNumber":"2","bindId":"262531657","userIp":"10.1.1.1" }?
?
? ??
?
?
? ??
?
總結
以上是生活随笔為你收集整理的基于testNG的数据驱动测试的自动化测试实践(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新浪体育——篮球足球的直播和战报爬取
- 下一篇: 8.4|Crypto Tech Nigh