知道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