目前互聯網金融火的一塌糊涂,基于互聯網金融平臺的自動化測試的項目也是如火如荼的進行。筆者手頭上負責一個p2p項目的測試框架開發,因此如何設計一套有效的測試框架也成為工作所需和互相交流測試經驗的必須。
![]()
這個網站的后臺主要是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必備、Shell、互聯網程序原理、Mysql數據庫、抓包工具專題、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試、安全測試等。
![]()
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.