自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Tep 支持 MVC 架構實現(xiàn)用例數(shù)據(jù)分離

開發(fā) 架構
ttpRunner已經(jīng)眾所周知,此處不做過多介紹。用例數(shù)據(jù)一體指的是把用例和數(shù)據(jù)都寫在一個test.py文件里面,這樣的好處是簡單直接明了,特別適合剛開始用pytest寫自動化代碼的同學,從上往下一氣呵成就完成了一個自動化用例,收獲成就感的同時,也能很方便的共享給其他人使用,單個文件就能跑起來。

大家好,我是剛哥。

tep已經(jīng)支持了兩種開發(fā)模式:用例數(shù)據(jù)一體和HttpRunner(第三版)。HttpRunner已經(jīng)眾所周知,此處不做過多介紹。用例數(shù)據(jù)一體指的是把用例和數(shù)據(jù)都寫在一個test.py文件里面,這樣的好處是簡單直接明了,特別適合剛開始用pytest寫自動化代碼的同學,從上往下一氣呵成就完成了一個自動化用例,收獲成就感的同時,也能很方便的共享給其他人使用,單個文件就能跑起來。

但是當我在公司用SpringBoot開發(fā)了一個后端服務后,嘗到了MVC架構所帶來的高可維護性,加上在跟各位大佬聊天時,也聽說很多公司對接口自動化做了分層設計,于是讓tep支持用例數(shù)據(jù)分離的開發(fā),已經(jīng)變得很重要了。用例數(shù)據(jù)分離指的是用例只有邏輯沒有數(shù)據(jù),這樣在修改數(shù)據(jù)的時候,用例基本不需要變化就能適應,用例看起來是非常簡潔的,就像這樣:

  1. class Test: 
  2.     case_vars = TepVars() 
  3.     case_vars.vars_ = { 
  4.         "domain""http://127.0.0.1:5000"
  5.         "skuNum""3" 
  6.     } 
  7.  
  8.     def test(self): 
  9.         # 登錄 
  10.         Login(Test).post() 
  11.         # 搜索商品 
  12.         SearchSku(Test).get() 
  13.         # 添加購物車 
  14.         AddCart(Test).post() 
  15.         # 下單 
  16.         Order(Test).post() 
  17.         # 支付 
  18.         Pay(Test).post() 

這就是tep支持的用例數(shù)據(jù)分離的用例的樣子。

我增加了一個services文件夾,用于存放接口:

先看下登錄Login.py:

  1. class Login(BaseRequest): 
  2.  
  3.     def post(self): 
  4.         response = self.request( 
  5.             "post"
  6.             url=self.case_vars.get("domain") + "/login"
  7.             headers={"Content-Type""application/json"}, 
  8.             json={ 
  9.                 "username""dongfanger"
  10.                 "password""123456"
  11.             } 
  12.         ) 
  13.         assert response.status_code < 400 
  14.         self.case_vars.put("token", response.jmespath("token")) 
  • 必須繼承BaseRequest。
  • self.request和requests.request用法完全一致。
  • self.case_vars用于在測試用例的測試步驟之間傳遞變量,有get和put兩個操作。
  • response.jmespath("token")是封裝了requests.Response后添加的方法,替代jmespath.search("token", response.json())的寫法。

BaseRequest的定義如下:

  1. import jmespath 
  2. from requests import Response 
  3. from tep.client import request 
  4.  
  5.  
  6. class TepResponse(Response): 
  7.     def __init__(self, response): 
  8.         super().__init__() 
  9.         for k, v in response.__dict__.items(): 
  10.             self.__dict__[k] = v 
  11.  
  12.     def jmespath(self, expression): 
  13.         return jmespath.search(expression, self.json()) 
  14.  
  15.  
  16. class BaseRequest: 
  17.     def __init__(self, clazz): 
  18.         self.case_vars = clazz.case_vars 
  19.  
  20.     def request(self, method, url, **kwargs): 
  21.         response = request(method, url, **kwargs) 
  22.         return TepResponse(response) 
  • TepResponse對requests.Response做了封裝,添加了jmespath方法。
  • BaseRequest的__init__在初始化時傳入測試類(test.py里面測試用例的類),提取case_vars對象,這樣接口類繼承以后,就能用self.case_vars來get和put變量了。
  • 同時調(diào)用tep.client.request,并把response以封裝后的TepResponse返回。

那么問題來了,如何在接口之間傳遞參數(shù)呢?請看test_login_pay_mvc.py、Login和SearchSku這三段代碼:

  1. # test_login_pay_mvc.py 
  2.  
  3. class Test: 
  4.     case_vars = TepVars() 
  5.     case_vars.vars_ = { 
  6.         "domain""http://127.0.0.1:5000"
  7.         "skuNum""3" 
  8.     } 
  9.  
  10.     def test(self): 
  11.         # 登錄 
  12.         Login(Test).post() 
  13.         # 搜索商品 
  14.         SearchSku(Test).get() 
  15.         # 添加購物車 
  16.         AddCart(Test).post() 
  17.         # 下單 
  18.         Order(Test).post() 
  19.         # 支付 
  20.         Pay(Test).post() 
  1. # Login.py 
  2.  
  3. class Login(BaseRequest): 
  4.  
  5.     def post(self): 
  6.         response = self.request( 
  7.             "post"
  8.             url=self.case_vars.get("domain") + "/login"
  9.             headers={"Content-Type""application/json"}, 
  10.             json={ 
  11.                 "username""dongfanger"
  12.                 "password""123456"
  13.             } 
  14.         ) 
  15.         assert response.status_code < 400 
  16.         self.case_vars.put("token", response.jmespath("token")) 
  1. # SearchSku.py 
  2.  
  3. class SearchSku(BaseRequest): 
  4.  
  5.     def get(self): 
  6.         response = self.request( 
  7.             "get"
  8.             url=self.case_vars.get("domain") + "/searchSku"
  9.             headers={"token": self.case_vars.get("token")}, 
  10.             params={"skuName""電子書"
  11.         ) 
  12.         self.case_vars.put("skuId", response.jmespath("skuId")) 
  13.         self.case_vars.put("skuPrice", response.jmespath("price")) 
  14.         assert response.status_code < 400 
  • test_login_pay_mvc.py文件的Test測試用例里面,定義了用例級別的變量:domain。
  • Login.py文件通過self.case_vars.get("domain")獲取domain,然后把token通過self.case_vars.put("token", response.jmespath("token"))存入token。
  • SearchSku.py文件通過self.case_vars.get("token")獲取token,并用self.case_vars.put()存入skuId和skuPrice,供下一個接口AddCart使用,以此類推。

用例數(shù)據(jù)分離的寫法遵從了MVC架構,并借鑒了HttpRunner和JMeter的部分設計,相比于用例數(shù)據(jù)一體,可能編寫體驗沒有那么方便,但是維護性和可復用性都很高,其中接口類的get和post可以根據(jù)數(shù)據(jù)需要定義多個如get_a和post_b等,以支持多種數(shù)據(jù),略微有一丟丟復雜,適合有代碼經(jīng)驗的同學。

如何才能使用用例數(shù)據(jù)一體、用例數(shù)據(jù)分離、HttpRunner3種開發(fā)模式呢?等tep0.9.4版本發(fā)布后進行升級,用tep startproject demo命令創(chuàng)建項目腳手架,就會包含登錄到下單流程的全部3種開發(fā)模式示例代碼,開箱即用,一鍵運行成功。

 

從此刻開始,tep實用性已經(jīng)提升了一個檔次,但是我將停下它的腳步,將注意力放到HttpRunner3的源碼學習中,并產(chǎn)出一系列文章,站在巨人的肩膀上,才能看得更遠。為什么HttpRunner如此重要?因為畢竟tep的技術就是從HttpRunner學來的。

 

責任編輯:武曉燕 來源: 測試開發(fā)剛哥Python
相關推薦

2009-12-30 09:45:52

Silverlight

2022-01-03 18:15:35

FlaskTepHttpRunner

2023-10-23 10:43:24

SpringRestful風格

2016-10-24 23:18:55

數(shù)據(jù)分析漏斗留存率

2024-09-22 10:46:33

數(shù)據(jù)飛輪算法

2014-05-19 15:59:35

2009-12-23 10:46:38

WPF實現(xiàn)用戶界面

2016-12-19 11:17:48

架構 MVC

2024-10-08 14:52:37

2014-07-22 14:48:05

2009-07-23 13:36:03

2010-01-28 10:00:54

linux用戶注銷logout

2017-03-27 16:09:58

2012-05-04 09:28:49

Linux

2020-11-24 09:56:12

數(shù)據(jù)源讀寫分離

2016-04-23 20:31:17

曙光

2017-11-24 17:20:37

數(shù)據(jù)庫數(shù)據(jù)倉庫讀寫分離

2010-08-04 10:48:17

路由器

2020-03-24 14:16:18

ProxySQLMySQL數(shù)據(jù)庫

2018-01-01 05:23:13

服務化讀寫分離架構
點贊
收藏

51CTO技術棧公眾號