知道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. 【题解】Luogu P2605 [ZJOI2010]基站选址

    原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...

  2. node.js 初学(一)—— http fs 服务器/文件/post get

    node.js 初学 —— http fs 服务器/文件/post get 这个世界,从来不会给失败者颁奖! 了解 node.js (开源) node.js 是用来做后台开发的,但是现在大部分前端人员 ...

  3. 02: docker高级篇

    1.1 Docker Compose 1.Docker Compose 介绍 1. Compose是一个定义和管理多容器的工具,使用Python语言编写. 2. 使用Compose配置文件描述多个容器 ...

  4. SqlBulkCopy类(将一个表插入到数据库)

    利用SqlBulkCopy类一次插入多条数据,即将一个表直接插入数据库. 首先,新建一个表,要保证表中的列名与数据库表的字段保持一致. 如果数据库一张TableMenuRole表,ID自增,MenuI ...

  5. Computer Study

    2017.12.15日开始制定长期学习计划: 大二上: 目前短期计划: 1.每天一道PAT乙级(弄完PAT乙级)+校OJ(打基础).   2.先复习C++,17周后开始复习数据结构.(补任务  刚刚发 ...

  6. openwrt中在软件包中定义PKG_INSTALL将会发生什么?

    答: 将会使用默认软件包安装方式,相关代码如下 . 在include/package.mk中: Build/Install=$(if $(PKG_INSTALL),$(call Build/Insta ...

  7. (转)开源项目miaosha(下)

    石墨文档:https://shimo.im/docs/2XlwliBQAYsKCHbq/ (二期)20.开源秒杀项目miaosha解读(下) [课程20]jmeter.xmind81.5KB [课程2 ...

  8. R语言 apply,sapply,lapply,tapply,vapply, mapply的用法

    apply() apply(m,dimcode,f,fargs) m 是一个矩阵. dimcode是维度编号,取1则为对行应用函数,取2则为对列运用函数. f是函数 fargs是f的可选参数集 > ...

  9. html 之 table cellpadding,cellspacing

    单元格(cell) -- 表格的内容 单元格边距(表格填充)(cellpadding) -- 代表单元格外面的一个距离,用于隔开单元格与单元格空间 单元格间距(表格间距)(cellspacing) - ...

  10. 题解——UVA11997 K Smallest Sums

    题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[], ...