接口自動化測試架構規劃
1、編程語言的選型
2、編程工具的選型
3、自動化測試框架的選型
概念:一個架子 (數據驅動),有現成的一些代碼---提高效率
unittest---python解釋器自帶
unittest升級版-pytest--
unittest升級版-nose
httprunner框架
rf框架---關鍵字
4、報告可視化方案的選型
htmltestrunner---簡單的html報告
beautifulreport
allure
5、持續方案的選型:ci持續集成---jenkins
6、倉庫服務器的選型:github, gitlab, gitee 碼雲
7、測試管理工具的選型: 禪道 , jira
工程目錄的建立
包:代碼需要import導入
文件夾:可以使用路徑獲取
- common:公共模塊--包
· baseAPI--->給後面的其他業務層類繼承,如果子類有特殊需求,就重寫父類方法,沒有則無需重寫
· 發送方法: 增刪改查4種方法 - libs:基本業務層的代碼庫包(繼承common裏面的BaseAPI)(業務相關)
· 登錄
· 訂單管理 - configs 配置包---考慮課維護性
· host :切換測試環境
· 接口url 玻璃--做配置 - data 數據/用例excle測試用例 文件夾--(yaml格式文件)
- testcase 測試用例代碼包
- outFiles
· logs : 日誌文件夾
·report 報告
·screenShot -
utils(tools) 工具包
封裝baseAPI
- 封裝思路:
1、爲所有的業務模塊提供基本的接口操作:增刪改查+發送接口
2、日誌,截圖都可以在基類中封裝
3、斷言方法 - 發送公共請求方法:
def request_send(self,method,url):
· 實際調用時,發送方法都需要傳遞兩個參數
· 每一個接口的數據都不一樣
· 反饋:很麻煩
優化:
· 思路:代碼與配置分離
· 實施:method url 可以放到一個配置文件中去--apiPathConfig.yml
· 難點:代碼如何識別對應模塊、對應接口、接應參數
· 場景分類:
常規風格的接口格式:
·方法舉例:增加數據接口:post,修改也是post
·url舉例 : 增加接口 /sql 修改 /sq_admin/{id}
"""
封裝思路:
1- 爲所有的業務模塊提供的基本接口操作:增刪改查+發送接口
2- 日誌 截圖都可以在基類裏封裝
3- 斷言方法
@log裝飾器
def login():
try:
xxxxx
except:
log.error()
"""
#---------------封裝的思路啓發--------------
"""
發送公共請求方法:
def request_send(self,method,url):
- 實際調用發送方法必須傳遞2個參數,
- 每一個接口的數據還不一樣
- 反饋:很麻煩
優化:
思路:代碼與配置分離
實施:method url 可以放到一個配置文件 apiPathConfig.yml
難點:代碼怎麼可以識別到對應的模塊、對應的接口、對應的參數
場景分類:
- 常規風格的接口格式
- 方法舉例: 增加數據接口: post ;修改也是 post
- url舉例:增加接口 /sq 修改 /sq_xintian/{id}
- restful接口風格
- 方法規則:get post delete put
- url規範: 一樣的
"""
import requests
from utils.handle_yaml import get_yaml_data
import inspect
from configs.config import HOST
class BaseAPI:
def __init__(self):
#獲取對應模塊的接口信息
self.data = get_yaml_data('../configs/apiPathConfig.yml')[self.__class__.__name__]#根據類名去獲取
print('類名是--->', self.__class__.__name__)
print('類接口數據--->', self.data)
#---------發送的公共方法-每一個接口都會調用他----------
def request_send(self,data):
try:
#api_data == {'path': '/account/sLogin', 'method': 'POST'}
api_data = self.data[inspect.stack()[1][3]]
resp = requests.request(
method=api_data['method'],#方法
url=f'{HOST}{api_data["path"]}',#url
data=data)
return resp.json()
except:
pass
演示案例:
import inspect
def send():
# inspect.stack()[1][3] 獲取調用者的函數名字
print(f---'{inspect.stack()[1][3]}調用了send()方法--')
def login():
print('----函數login開始執行了---')
send()
login()
執行結果: