mock原理(一)


1. 什么是mock?

在軟件測試過程中,對於一些不容易構造、獲取的對象,用一個虛擬的對象來替代它,以達到相同的效 果,這個虛擬的對象就是Mock。
在前后端分離項目中,當后端工程師還沒有完成接口開發的時候,前端開發工程師利用Mock技術,自 己用mock技術先調用一個虛擬的接口,模擬接口返回的數據,來完成前端頁面的開發。
其實,接口測試和前端開發有一個共同點,就是都需要用到后端工程師提供的接口。所以,當我們做接 口測試的時候,如果后端某些接口還不成熟、所依賴的接口不穩定或者所依賴的接口為第三方接口、構 造依賴的接口數據太復雜等問題時,我們可以用mock的方式先虛擬這些接口返回來代替。提高工作效 率。

2. moco介紹 

實現mock的技術很多,這些技術中,可以分為兩類,mock數據和mock服務: mock數據:即 mock 一個對象,寫入一些預期的值,通過它進行自己想要的測試。常見的有: EasyMock、Mockito 、WireMock、JMockit。主要適用於單元測試。 mock 服務:即mock 一個 sever,構造一個依賴的服務並給予他預期的服務返回值,適用范圍 廣,更加適合集成測試。如 moco框架。
Moco 是類似一個 Mock 的工具框架,一個簡單搭建模擬服務器的程序庫/工具,下載就是一個JAR包。 有如下特點:
只需要簡單的配置 request、response 等即可滿足要求 支持 http、https、socket 協議,可以說是非常的靈活性 支持在 request 中設置 Headers , Cookies , StatusCode 等 對 GET、POST、PUT、DELETE 等請求方式都支持
無需環境配置,有 Java 環境即可 修改配置后,立刻生效。只需要維護接口,也就是契約即可 支持多種數據格式,如 JSON、Text、XML、File 等 可與其他工具集成,如 Junit、Maven等

3. 下載moco

我們可以直接去github上獲取moco的jar包,當前版本是:V1.1.0。
地址:https://github.com/dreamhead/moco 這里展示了關於moco的介紹和源碼,我們可以點擊箭頭 處直接下載它的jar包。

 

下載完成后:

 

 

 4. 配置json文件 

我們需要先編輯一個json文件,用來模擬不同的請求,返回不同的響應。 新建一個文件,格式改為json,然后打開這個文件進行編輯。如下

[{    
    "description":"demo",   
     "request":{        
                    "uri":"/demo"       
                     },    
    "response":
                    {        
                "text":"Hello,demo"    
                    } 
}]            

  

其中
description是注釋(描述),由於json無法寫注釋,所以提供了用這個key

uri就是我們這個接口的統一資源標識符,可以根據模擬的接口自行定義

response里的內容即為返回的值

這是一個非常簡單的mock

 

 

 

 5. 啟動moco

moco項目是采用java開發的,所以啟動moco前,需要安裝jdk。如果以前安裝過的,請忽略!!!

首先:把我們下載下來的moco的jar包和剛剛編輯好的json文件放到同一個文件夾路徑下,如圖:

然后在該路徑下打開cmd命令行

在該路徑下,輸入cmd,按回車,彈出命令行. 

輸入命令:java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json

其中
jar包的名稱可根據自己下載的jar包版本來寫

http代表這個模擬的是http請求

-p 9090定義是端口號

-c test.json 是我們編輯的那個json文件名。


執行命名后,如圖:

 

 

 此時我們mock的服務以及啟動成功了,相當於在我們本地的9090端口上啟動的,所以我們可以通過瀏覽 器訪問一下localhost:9090/demo 來看看返回的結果,注意,這里/demo就是我們在json文件中定義的 uri

 

 

 

如圖,我們訪問后得到了json文件中編輯的返回值。以上我們就完成了用moco來幫助我們生成mock

 

6. 配置不同的請求

Demo1:約定URI 

[{
"description":"demo1=約定URI",
"request":{
"uri":"/demo1"
},
"response":{
"text":"Hello,demo1"
}
}]

  

 

Demo2:約定請求參數

[{
"description":"demo2=約定請求參數",
"request":{
"queries":{
"key1":"abc",
"key2":"123"
}
},
"response":{
"text":"Hello,demo2"
}
}]

  

 

 

3.Demo3:約定請求方法

[{
"description":"demo3=約定請求方法",
"request":{
"method":"DELETE"
},
"response":{
"text":"Hello,demo3"
}
}]

  因為換了請求方法,所以在postman里請求

 

 

 

 4.Demo4:約定請求頭

[{
"description":"demo4=約定請求頭",
"request":{
"method":"POST",
"headers":{
"Content-Type":"application/xml"
}
},
"response":{
"text":"Hello,demo4"
}
}]

  

 

 

 5.Demo5:約定請求體參數-form

[{
"description":"demo5=約定請求體參數-form",
"request":{
"forms":{
"key1":"abc"
}
},
"response":{
"text":"Hello,demo5"
}
}]

  

 

 

 6.Demo6:約定請求體參數-json

[{
"description":"demo6=約定請求體參數-json",
"request":{
"json":{
"key1":"value1",
"key2":"value2"
}
},
"response":{
"text":"Hello,demo6"
}
}]

  

 

 

 7.Demo7uri-startsWith匹配 :

[{
"description":"demo7=uri-startsWith匹配",
"request":{
"uri":{
"startsWith":"/sq" #只要地址里以sq開頭就可以
}
},
"response":{
"text":"Hello,demo7"
}
}]

  

 

 

 

 

 

 8.Demo8uri-endWith匹配

[{
"description":"demo8=uri-endsWith匹配",
"request":{
"uri":{
"endsWith":"sq" #以sq結尾
}
},
"response":{
"text":"Hello,demo8"
}
}]

  

 

 

 

 

 

 9.Demo9uri-contain包含

[{
"description":"demo9=uri-contain匹配",
"request":{
"uri":{
"contain":"fcl"
}
},
"response":{
"text":"Hello,demo9"
}
}]

  

 

 

 

 

 

 10.Demo10:返回狀態碼

[{
"description":"demo10=響應狀態碼",
"request":{
"uri":"demo10"
},
"response":{
"status":200
}
}]

  

 

 

 11.Demo11:返回響應頭

[{
"description":"demo11=響應頭",
"request":{
"uri":"demo11"
},
"response":{
"headers":{
"Content-Type":"application/json"
}
}
}]

  

 

 

 12.Demo12:重定向

[{
"description":"demo12=重定向",
"request":{
"uri":"demo12"
},
"redirectTo":"http://www.baidu.com"
}]

  

 

 

 重定向直接跳轉到了百度頁面

13.Demo13:返回JSON格式的數據

[{
"description":"demo13=返回json格式的數據",
"request":{
"uri":"/demo13"
},
"response":{
"json":{"key1":"value1","key2":"value2"}
}
}]

  

 

 7. moco總結

Moco還可以通過在json文件中添加cookiesheader、重定向這些參數,來模擬各種情況下的請求和
返回值,可以根據自己工作的需求去對這些東西進行了解。
Moco是熱更新的,所以啟動了jar包的服務之后,即使修改了json文件中的內容,也不需要重啟服務就
生效。
掌握了mock測試的技術,可以讓我們在開發沒有完成對應接口的時候,有接口文檔就提前進入到測試
狀態,是現在敏捷模式下不可或缺的技術,也是持續集成中一個重要的組成部分

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM