之前采用JMeter進行接口測試,每次給帶新人進行培訓比較麻煩,干脆用python實現,將代碼和用例分離,易於維護。
項目背景
公司的軟件采用B/S架構,進行數據存儲、分析、管理
工具選擇
python開發的速度很快,且容易上手,豐富的第三方庫,大大加快了開發速度和難度,自己開發一個簡單的框架,優點是足夠靈活,可以隨時根據需求進行變更
框架思路(unittest)
考慮可重用性和可維護性,針對測試人員編寫測試用例的方便性,采用數據驅動的設計方式,將數據分層出來,與業務邏輯剝離,測試人員就可以通過數據文件專注的寫測試用例,不用關注代碼編寫,提高了效率
將測試的結果生成HTML格式的測試報告
模塊介紹
# 封裝的方法
Package
Base.py 請求(POST、GET)
Unit.py 工具類(斷言、獲取response數據)
# 測試報告
Report
# 接口場景用到的資源(圖片、視頻)
Resource
# 測試用例
Test_case
TestCase_**.py
…
TestCase_**.py
# unittest框架
all_test.py (包括生成html格式的測試報告)
# 實現在外部配置文件中配置請求接口URL、參數
pageMessage.py
代碼介紹
封裝的POST請求,代碼如下:
def r_get(url, payload={}):
""" GET 請求 url:接口,payload:參數 """
response = ''
try:
# 根據傳入的參數長度判斷是否發送參數
if payload.__len__() == 0:
r = s.get(url, headers=heads)
else:
r = s.get(url, params=payload, headers=heads)
response = json.loads(r.text)
except Exception as err:
print err
return response
封裝的GET請求,代碼如下:
def r_post(url, payload={}, tp=''):
""" POST 請求 url:接口,payload:參數 ,tp:類型"""
try:
# 根據傳入的參數長度判斷是否發送參數
if payload.__len__() == 0:
r = s.post(url, headers=heads)
else:
# 根據傳入的參數類型判斷是否發送json格式的
if tp == 'json': # json數據
r = s.post(url, data=json.dumps(payload), headers=heads)
else:
r = s.post(url, data=payload, headers=heads)
response = json.loads(r.text)
except Exception as err:
print err
return response
獲取response響應數據,代碼如下:
def get_message(text, key):
""" 獲取返回報文的數據 text:報文內容,key: 獲取參數關鍵字 """
value = ''
try:
data = text['data']
# print '報文格式:', type(data)
if type(data) == list:
da = data[0] # 報文格式
value = da[key]
else:
value = data[key]
value = str(value)
print 'Message: ' + key + '=' + value
except Exception as err:
print "Error:", (err)
return value
斷言,代碼如下:
def assert_case(url, text, cod, mes):
""" 斷言,判斷 code 和 message """
code, message = '', ''
try:
code = text['code']
message = text['message']
assert_that(str(cod)).is_equal_to(str(code))
assert_that(str(mes)).is_equal_to(str(message))
except Exception, e:
print url + ' code: ' + str(code) + ' message:' + str(message) + ' ' + str(e)