銀行軟體測試:基於網際網路金融平臺的測試框架設計與分析

博為峰網校發表於2022-12-01

目前網際網路金融火的一塌糊塗,基於網際網路金融平臺的自動化測試的專案也是如火如荼的進行。筆者手頭上負責一個p2p專案的測試框架開發,因此如何設計一套有效的測試框架也成為工作所需和互相交流測試經驗的必須。進入》 軟體測試社群學習交流 加我VX:atstudy-js 回覆“測試”,進入 自動化測試學習交流群~~

這個網站的後臺主要是php和java, 也就是說,一些基礎的服務,如充值提現,投標起息還款,是採用spring mvc的框架來寫的,然後php來呼叫java的API,java平臺透過intercepter將php 傳遞過來的http請求對映到對應的controller,controller再透過map對映到對應的服務和實現。

簡單來說網站框架就類似如下:

網站一些基本的業務如註冊登入,使用者中心,投資、紅包等等由使用者前臺觸發php呼叫,一些活動、紅包、禮品券等等由後臺觸發php呼叫,充值提現投資起息還款由java平臺實現。

基於這樣的平臺的 自動化測試框架選型的時候,筆者考慮過以下幾種:

一種是採用基於selenium,整合thinkphp的框架來寫。主要的原理就是利用selenium的firefox外掛來錄製,頁面上的html元素和javascript指令碼,然後做2次封裝將這些錄取到的元素和js封裝成一個個的標準物件,儲存到標準物件庫,然後再新增一些資料庫的資料準備和資料清理函式,以及資料庫增刪改查語句。

然後在引擎指令碼中,引用和呼叫這些物件的方法,類似如edit,type等等,然後就在頁面跳轉的時候加上馭迴圈和一些判斷,檢測頁面元素的值是否存在,或者是檢測一些方法返回值,或者是採用斷言來處理資料庫查詢到的結果和頁面上返回的結果做匹對,可以在以selenium為基本的框架的時候,引入thinkPHP或者YII框架加快開發指令碼速度。

另外一種是採用QTP方式來使用,其基本原理也和採用selenium原理大同小異,唯一的差別就是QTP提供了一個很好和強大的基本類庫,以及一個很好的物件識別機制obeject Spy,QTP的基本類庫裡面基本什麼都有,java,.net, web,乃至於dephi……

在識別物件的時候可以直接透過java裡面的類來對映,也可以直接用web相關類庫裡面的類,甚至是windows平臺類……QTP提供了多種識別方式以幫助定位物件,這樣只用修改少量的物件屬性,在回放指令碼和編輯核心程式碼的時候,就可以起到事半功倍的效果,但是QTP也有缺點,就是對於Js的處理不方便,還有就是時刻需要啟動QTP,而不能和一些開源測試框架特別是java開源專案,來實現自動部署測試用例和自動打包的整合。

ruby +watir 的原理和selenium也是類似,也是一種基於WEB GUI的自動化測試框架,筆者研究甚少,也就不多言了。

但是由於p2p行業的特性,這些基於web的自動化測試框架有很多不適合的地方,跟投資充值提現相關的這些相關的功能,比較在乎的不僅僅是頁面上的一些元素功能的顯示,更關心的是這個資料的正確性。

如果採用基於GUI的方式做自動化測試,個人感覺針對頁面元素的識別和校驗往往並不能反映資料正確性,而在處理頁面元素異常的時候,也往往無法針對複雜業務邏輯和資料做較強的處理和效益,而且GUI是模擬人工處理,在執行效率上面,也是效果較差,而且如果出現某個頁面元素無法識別或者異常,有可能中斷整個頁面的處理,在分析程式碼覆蓋率的時候,基於web的方式也不是那麼容易分析。

目前的這個專案,java向PHP平臺提供的主要是基於HTTP協議的restful應用,之所以採用restful,而不用webservice來處理傳輸資料相關,是因為webservice即便是採用json而不是xml來處理傳輸資料,相比較restful也顯得較重,json還需要加密解密解析、序列化什麼的,而在 restful 裡面直接就可以透過 http 請求對資源進行操作。

因此筆者覺得還是從controller層直接進行介面測試比較直接有效,又考慮到 spring框架裡面提供了mock http請求的方法,而web UI的正確性相對於後臺業務資料正確性的優先順序就沒有那麼高了,而spring的測試框架裡面雖然可以透過斷言controller層返回的ModleAndView物件校驗controller的正確性,即透過介面測試來效益結果,但是如果controller層後面的物件 太多的話,一旦出現問題也不便於排錯。

因此基本的測試框架思路就是採用spring mvc提供的mock restful的工具類,然後引入斷言機制和資料庫處理,來逐個controller分析業務邏輯的正確性和資料正確性。而sping MVC本身也提供了一套測試框架,可以透過服務端測試和客戶端測試分別來測試。

服務端測試在使用spring mvc測試框架之前,可能採取類似如下程式碼:

@Test

public void serverSample() {

MockHttpServletRequest request = new MockHttpServletRequest();

ModelAndView mav = new sampleController.function(parameters);

ModelAndViewAssert.assertViewName(mav, user/view);

ModelAndViewAssert.assertModelAttributeAvailable(mv, user);

}

}

採用伺服器端測試後,可以採用如下兩種方法:

standalone:

public class ServerTest {

@Autowired

private MockMvc mockMvc;

@Before

public void init() {

SampleController sample = new SampleController();

mockMvc = MockMvcBuilders.standaloneSetup(SampleController).build();

}

}

 整合:

public class ServerTest {

@Autowired

private WebApplicationContext wac;

private MockMvc mockMvc;

@Before

public void init() {

mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

}

}

 測試:

@Test

public void testSample() throws Exception {

MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(/user/1))

.andExpect(MockMvcResultMatchers.view().name(user/view))

.andExpect(MockMvcResultMatchers.model().attributeExists(user))

.andDo(MockMvcResultHandlers.print())

.andReturn();

Assert.assertNotNull(result.getModelAndView().getModel().get(user));

}

以上是採用spring MVC的服務端測試方法,至於客戶端則有幾種方法,

1.透過jetty啟動容器,真實對映到controller層實現;

2.使用spring boot測試

3.使用mock service server測試,第三種方式基本上屬於使用resttemplate來測試客戶端比較好的方法;

即先透過MockRestServiceServer建立RestTemplate的Mock Server,然後新增客戶端請求斷言,判斷客戶端請求的斷言是否正確,3、新增服務端響應,檢查伺服器端相應是否正確。

客戶端相關程式碼在網路上也有很多資源,因此也就不再贅敘,這裡主要是提供一種基於spring mvc框架和基於restful應用如何測試controller層的思想。

最後:

可以到我的個人V:atstudy-js,免費領取一份10G軟體測試工程師面試寶典文件資料。以及相對應的影片學習教程免費分享!其中包括了有基礎知識、Linux必備、Mysql資料庫、抓包工具、介面測試工具、測試進階-Python程式設計、Web自動化測試、APP自動化測試、介面自動化測試、測試高階持續整合、測試架構開發測試框架、效能測試等。

這些測試資料,對於做【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2926244/,如需轉載,請註明出處,否則將追究法律責任。