博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用unittest+ddt进行接口测试(二):使用yaml文件管理测试数据
阅读量:4490 次
发布时间:2019-06-08

本文共 4221 字,大约阅读时间需要 14 分钟。

知道ddt的基本使用方法之后,练习把之前用excel文件来维护的接口测试用例改用unittest+ddt来实现。

这里我选用yaml文件来管理接口参数,开始本来想用json,但是json无法添加注释,可读性不好。

1.向yaml文件中添加数据

下面截图是接口文档中的各个接口,每个接口都有一个固定的序号,所以在设计每个接口的测试数据时,以序号来区分不同接口

yaml文件内容如下,需要注意的是yaml的语法:

(1)键值对用冒号分割,但是冒号后需要加一个空格

(2)禁止使用tab缩进,只能使用空格键;缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级

(3)字符串可以不用引号标注,也可以加引号,如果想把数字变为字符串,加引号即可

(4)使用#表示注释

详情可以参考博客:https://blog.csdn.net/vincent_hbl/article/details/75411243

2.简单demo:python读取yaml文件,取出接口参数

import yamlfp = open('../dataconfig/信息互动模块接口.yaml', encoding='utf-8')   # 有中文字符的话,加编码格式testdata = yaml.load(fp)t = testdata['5.2.1.4']print(t)

3.完整流程

(1)封装读取yaml文件方法

handle_yaml.py# coding: utf-8# author: hmkimport yamlimport osclass 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 dataif __name__ == '__main__':    test = HandleYaml()    p = test.get_data()    print(p['5.2.1.1'])

(2)封装requests请求方法

# coding: utf-8# author: Archerimport requestsimport jsonclass 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: Archerimport unittestimport ddtfrom base.run_method import RunMethodfrom utils.handle_yaml import HandleYamlget_data = HandleYaml()  # 从yaml文件中取出该接口的参数params = get_data.get_data()['5.2.1.4']@ddt.ddtclass 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: hmkfrom HTMLTestRunner import HTMLTestRunnerimport unittestimport time, osroot_dir = os.path.dirname(os.path.abspath('.'))  # 获取当前文件所在目录的父目录的绝对路径,也就是项目所在路径E:\DDT_Interfacecase_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

转载于:https://www.cnblogs.com/hanmk/p/8970770.html

你可能感兴趣的文章
获取url
查看>>
re模块_2
查看>>
迭代器
查看>>
多线程共享全局变量(加锁)
查看>>
gevent 完成多任务_2
查看>>
判断该url下面是否包含指定的文件
查看>>
greenlet
查看>>
域名生成
查看>>
邮箱判断
查看>>
网页简体变为繁体
查看>>
gevent 完成多任务
查看>>
school
查看>>
python之钉钉机器人zabbix报警
查看>>
nginx配置文件服务器 linux
查看>>
使用safe-rm替换rm命令,防止误删除
查看>>
自定义注解及写一个自定义注解防止数据重复提交
查看>>
springboot发送email邮件
查看>>
nginx安装配置
查看>>
springcloud-alibaba手写负载均衡的坑,采用restTemplate,不能添加@loadbalanced注解,否则采用了robbin...
查看>>
nacos作为配置中心动态刷新@RefreshScope添加后取值为null的一个问题
查看>>