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

fp = 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: 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

利用unittest+ddt进行接口测试(二):使用yaml文件管理测试数据的更多相关文章

  1. 利用unittest+ddt进行接口测试(一):简单demo

    一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向.逆向等多种组合.所以在测试一个接口时通常会编写多条case,而这些case除了传参不同外,其实并没什么区别. 这个时候就可以利用ddt ...

  2. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(二)

    可以参考 python+requests接口自动化完整项目设计源码(一)https://www.cnblogs.com/111testing/p/9612671.html 原文地址https://ww ...

  3. python基础===利用unittest进行测试用例执行的几种方式

    利用python进行测试时,测试用例的加载方式有2种:  一种是通过unittest.main()来启动所需测试的测试模块:  一种是添加到testsuite集合中再加载所有的被测试对象,而tests ...

  4. Loadrunner 脚本开发-利用web_custom_request函数进行接口测试

    脚本开发-利用web_custom_request函数进行接口测试 by:授客 QQ:1033553122 一.POST + JSON格式参数 例: web_custom_request(" ...

  5. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

  6. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  7. requests+unittest+ddt+xlrd+pymysql+BeautifulReport数据驱动

    # ddcapitestpython XXX接口自动化测试 # 一.数据驱动的思路 1.采用requests+unittest+ddt+xlrd+pymysql+BeautifulReport 2.r ...

  8. Python&Selenium 数据驱动【unittest+ddt+Excel】

    一.摘要 一般情况下我们为了更好的管理测试数据会选择将测试数据存储在Excel文件当中去,本节内容将展示给读者将测试数据存储在Excel文档中的案例. 二.创建存储测试数据的Excel 创建一个Exc ...

  9. Python&Selenium 数据驱动【unittest+ddt】

    一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt实现数据驱动 二.测试代码 # encoding = utf-8 ""& ...

随机推荐

  1. springboot 项目pom.xml文件基本配置

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  2. Codeforces 839A Arya and Bran

    Bran and his older sister Arya are from the same house. Bran like candies so much, so Arya is going ...

  3. bzoj 3237 连通图 - 并查集 - 线段树

    Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconne ...

  4. Python 用pygame模块播放MP3

    安装pygame(这个是python3,32位的) pip安装这个whl文件 装完就直接跑代码啦,很短的 import time import pygame file=r'C:\Users\chan\ ...

  5. 4. 多重背包问题 I

    多重背包问题 I 描述 有 NN 种物品和一个容量是 VV 的背包. 第 ii 种物品最多有 sisi 件,每件体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使物品体积总和不超过背包 ...

  6. SpringBoot 使用Sharding-JDBC进行分库分表及其分布式ID的生成

    为解决关系型数据库面对海量数据由于数据量过大而导致的性能问题时,将数据进行分片是行之有效的解决方案,而将集中于单一节点的数据拆分并分别存储到多个数据库或表,称为分库分表. 分库可以有效分散高并发量,分 ...

  7. 排它平方数|2013年蓝桥杯A组题解析第二题-fishers

    排它平方数 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是 ...

  8. ZOJ 3962 Seven Segment Display(数位DP)题解

    题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...

  9. js 二分搜索树删除子节点

    删除的节点含有左子树或者右子树,用其子树来代替成为被删除节点的父节点的子树 删除左右都有孩子的节点,找到右边子树最小的节点作为父节点

  10. 完全卸载oraclean安装

    完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...