這裏我選用yaml文件來管理接口參數,開始本來想用json,但是json無法添加註釋,可讀性不好。
下面截圖是接口文檔中的各個接口,每個接口都有壹個固定的序號,所以在設計每個接口的測試數據時,以序號來區分不同接口
yaml文件內容如下,需要註意的是yaml的語法:
(1)鍵值對用冒號分割,但是冒號後需要加壹個空格
(2)禁止使用tab縮進,只能使用空格鍵;縮進長度沒有限制,只要元素對齊就表示這些元素屬於壹個層級
(3)字符串可以不用引號標註,也可以加引號,如果想把數字變為字符串,加引號即可
(4)使用#表示註釋
詳情可以參考博客: /vincent_hbl/article/details/75411243
2. 簡單 demo : python 讀取 yaml 文件,取出接口參數
import yaml
fp = open('../dataconfig/信息互動模塊接口.yaml', encoding='utf-8')? #有中文字符的話,加編碼格式
testdata = yaml.load(fp)
t = testdata['5.2.1.4']
print(t)
(1)封裝讀取yaml文件方法
handle_yaml.py
# coding: utf-8
# author: hmk
importyaml
importos
classHandleYaml:
def __init__(self,file_path=None):
if file_path:
self.file_path = file_path
else:
root_dir =os.path.dirname(os.path.abspath('.'))
# os.path.abspath('.')表示獲取當前文件所在目錄;os.path.dirname表示獲取文件所在父目錄;所以整個就是項目的所在路徑self.file_path = root_dir +'/dataconfig/信息互動模塊接口.yaml'? #獲取文件所在的相對路徑(相對整個項目)
#elf.data = self.get_data()
def get_data(self):
fp =open(self.file_path, encoding='utf-8')
data =yaml.load(fp)
return data
if __name__ == '__main__':
test = HandleYaml()
p = test.get_data()
print(p['5.2.1.1'])
[if !vml][endif]
(2)封裝requests請求方法
[if !vml][endif]
# coding: utf-8
# author: Archer
importrequests
importjson
classRunMethod:
defpost_main(self, url, data, header=None):if header is notNone:
res =requests.post(url=url, data=data, headers=header)
else:
res =requests.post(url=url, data=data)
# print(res.status_code)
# return res.json()
return res #為了方便後面斷言,這裏不再對服務器響應進行json格式編碼
def get_main(self, url, data=None, header=None):if header is notNone:
res =requests.get(url=url, params=data, headers=header)
else:
res =requests.get(url=url, params=data)
print(res.status_code)
# return
res.json()
return res
def run_main(self, method, url, data=None, header=None):
if method== 'POST':
res =self.post_main(url, data, header)
else:
res =self.get_main(url, data, header)
returnres
# returnjson.dumps(res, indent=2, sort_keys=False, ensure_ascii=False)? #使用json模塊格式化顯示結果
[if !vml][endif]
(3)壹個接口測試用例
[if !vml][endif]
# coding: utf-8
# author: Archer
importunittest
importddt
from base.run_method importRunMethod
from utils.handle_yaml importHandleYaml
get_data = HandleYaml()? # 從yaml文件中取出該接口的參數
params = get_data.get_data()['5.2.1.4']
@ddt.ddt
classTest(unittest.TestCase):
"""加載咨詢詳情接口"""
defsetUp(self):
self.url ='http://localhost:8088/ApprExclusiveInterface/api/enterprise/info/consult/loadDetail.v'
self.run =RunMethod()
@ddt.data(*params)
deftest(self, value):
r =self.run.run_main("GET", self.url, value)
print(r)
self.assertTrue(value['assert'] inr.text)
if __name__ == '__main__':
unittest.main()
(4)利用HTMLTestRunner生成測試報告
run_report.py
# coding: utf-8
# author: hmk
from HTMLTestRunner importHTMLTestRunner
importunittest
importtime, os
root_dir = os.path.dirname(os.path.abspath('.'))? # 獲取當前文件所在目錄的父目錄的絕對路徑,也就是項目所在路徑E:\DDT_Interface
case_dir = root_dir + '/test_case/'? # 根據項目所在路徑,找到用例所在的相對項目的路徑
print(root_dir)
print(case_dir)
"""定義discover方法"""
discover = unittest.defaultTestLoader.discover(case_dir,
pattern='test*.py', top_level_dir=None)
"""
1.case_dir即測試用例所在目錄
2.pattern='test_*.py' :表示用例文件名的匹配原則,“*”表示任意多個字符
3.top_level_dir=None:測試模塊的頂層目錄。如果沒頂層目錄(也就是說測試用例不是放在多級目錄中),默認為None
"""
if __name__ == "__main__":
"""直接加載discover"""
now = time.strftime("%Y-%m-%d%H_%M_%S")
filename = root_dir +'/report/' + now + '_result.html'? #定義報告存放路徑
print(filename)
fp = open(filename,'wb')
runner =HTMLTestRunner(stream=fp, title='個人網企業網接口測試報告', description='測試結果如下: ')
runner.run(discover)
fp.close()
ok ,unittest+ddt進行接口測試就完成了,還有很多不足,yaml配置文件還可以繼續設計優化,例如可以把請求url也加進去。
其實感覺如何設計測試用例,組織測試數據也是壹件很有意思的事情,很多事情都必須先有壹個良好的設計思路才會進行的更順暢。總之勤於思考,多參考他人的思路。不是有句話嗎,學而不思則罔,思而不學則殆。