知道ddt的基本使用方法以後,練習把以前用excel文件來維護的接口測試用例改用unittest+ddt來實現。html
這裏我選用yaml文件來管理接口參數,開始原本想用json,可是json沒法添加註釋,可讀性很差。python
下面截圖是接口文檔中的各個接口,每一個接口都有一個固定的序號,因此在設計每一個接口的測試數據時,以序號來區分不一樣接口json
yaml文件內容以下,須要注意的是yaml的語法:api
(1)鍵值對用冒號分割,可是冒號後須要加一個空格服務器
(2)禁止使用tab縮進,只能使用空格鍵;縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級post
(3)字符串能夠不用引號標註,也能夠加引號,若是想把數字變爲字符串,加引號便可測試
(4)使用#表示註釋優化
詳情能夠參考博客:https://blog.csdn.net/vincent_hbl/article/details/75411243編碼
import yaml fp = open('../dataconfig/信息互動模塊接口.yaml', encoding='utf-8') # 有中文字符的話,加編碼格式 testdata = yaml.load(fp) t = testdata['5.2.1.4'] print(t)
(1)封裝讀取yaml文件方法url
handle_yaml.py # coding: utf-8 # author: hmk import yaml import os class HandleYaml: 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' # 獲取文件所在的相對路徑(相對整個項目) # self.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'])
(2)封裝requests請求方法
# coding: utf-8 # author: Archer import requests import json class RunMethod: def post_main(self, url, data, header=None):if header is not None: 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 not None: 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) return res # return json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False) # 使用json模塊格式化顯示結果
(3)一個接口測試用例
# coding: utf-8 # author: Archer import unittest import ddt from base.run_method import RunMethod from utils.handle_yaml import HandleYaml get_data = HandleYaml() # 從yaml文件中取出該接口的參數 params = get_data.get_data()['5.2.1.4'] @ddt.ddt class Test(unittest.TestCase): """加載諮詢詳情接口""" def setUp(self): self.url = 'http://localhost:8088/ApprExclusiveInterface/api/enterprise/info/consult/loadDetail.v' self.run = RunMethod() @ddt.data(*params) def test(self, value): r = self.run.run_main("GET", self.url, value) print(r) self.assertTrue(value['assert'] in r.text) if __name__ == '__main__': unittest.main()
(4)利用HTMLTestRunner生成測試報告
run_report.py # coding: utf-8 # author: hmk from HTMLTestRunner import HTMLTestRunner import unittest import time, 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也加進去。
其實感受如何設計測試用例,組織測試數據也是一件頗有意思的事情,不少事情都必須先有一個良好的設計思路纔會進行的更順暢。總之勤于思考,多參考他人的思路。不是有句話嗎,學而不思則罔,思而不學則殆。
2018-04-29 12:53:22