unittest自动化测试举例:自动读取ymal用例&调用接口并生成报告
用unittest框架写的接口自动化实现过程:
1.编写ymal格式用例:

2.导入ddt模块,该模块的主要功能是帮你读取ymal用例文件,自动获取内容并循环调用函数,具体见代码。
3.导入BeautifulReport模块,生成报告的模块。
4.导入unittest模块,使用unittest模块框架,编写自动化调用接口测试。
代码:
import unittest,requests
import ddt
from BeautifulReport import BeautifulReport as bf
from urllib import parse #为了用parse.urljoin()方法,智能拼接url
@ddt.ddt #自动的把ymal文件中的用例读出来
class Login(unittest.TestCase): #打开用例文件,调用接口
base_url = 'http://118.xx.xx.xx/'
@ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,将yaml文件的字典自动传给**kwargs
def test_request(self,**kwargs): #多个参数时用**kwargs,它接收字典里所有的k,v,即用例里的k,v
detail = kwargs.get('detail','没写用例描述')
self._testMethodDoc = detail #动态的用例描述,即用例里的描述。不加的话,用例描述会为null
url = kwargs.get('url')#url
url = parse.urljoin(self.base_url,url)#parse.urljoin()自动拼接好url
method = kwargs.get('method','get')#请求方式,如果没有传参,默认是get请求
data = kwargs.get('data',{}) #请求参数,如果get不到的话,默认给一个空字典
header = kwargs.get('header',{})#请求头,默认给一个空字典
cookie = kwargs.get('cookie',{})#cookie,默认给一个空字典
check = kwargs.get('check')
method = method.lower() #大小写转成小写,便于处理
try:
if method=='get':
res = requests.get(url,params=data,cookies=cookie,headers=header).text #预期结果
#因为接口有异常的情况下, 可能返回的不是json串,会报错
else:
res = requests.post(url,data=data,cookies=cookie,headers=header).text #预期结果
except Exception as e:
print('接口请求出错')
res = e #e接口返回的错误信息
#用用例里的成功返回字段作为校验标示,这样写使这个校验可以通用所有的测试用例
for c in check: #实际结果(用例里check写成了一个list)
self.assertIn(c,res,msg='预计结果不符,预期结果【%s】,实际结果【%s】'%(c,res)) #assertIn()断言,如果c不在check里,不会进行第二次循环校验 sutie = unittest.TestSuite() #实例化用例集合
sutie.addTest(unittest.makeSuite(Login)) #将Login函数添加进来
run = bf(sutie) #实例化报告
run.report('login_test','登录测试用例') #运行并生成报告文件
print(run.success_count) #通过的次数
print(run.failure_count) #失败的次数
注意事项/知识点:
1.from urllib import parse ,为了用parse.urljoin()方法,智能拼接url
2.ddt模块
3.断言:.assertIn(a,b,msg),判断a是否在b里,不是的话给出报错信息:msg
4.将结果通过for c in check的方式判断,可以作为通用方式来判断所有测试用例,较简单,通用。
5.在首次运行时,@ddt.file_data()函数会报错,如下图:

修正方法:鼠标移动至@ddt.file_data,按住Ctrl并用鼠标点击file_data函数,进入其源码,进入open()方法,加入encoding='utf-8'即可。


另外,也有一种比较繁琐的校验方法,如下:
import unittest,requests
import ddt
from BeautifulReport import BeautifulReport as bf
from urllib import parse #为了用parse.urljoin()方法,智能拼接url
@ddt.ddt #自动的把ymal文件中的用例读出来
class Login(unittest.TestCase): #打开用例文件,调用接口
base_url = 'http://118.xx.xx.xx/'
@ddt.file_data('login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数,将yaml文件的字典自动传给**kwargs
def test_request(self,**kwargs): #多个参数时用**kwargs,它接收字典里所有的k,v,即用例里的k,v
detail = kwargs.get('detail','没写用例描述')
self._testMethodDoc = detail #动态的用例描述,即用例里的描述。不加的话,用例描述会为null
url = kwargs.get('url')#url
url = parse.urljoin(self.base_url,url)#parse.urljoin()自动拼接好url
method = kwargs.get('method','get')#请求方式,如果没有传参,默认是get请求
data = kwargs.get('data',{}) #请求参数,如果get不到的话,默认给一个空字典
header = kwargs.get('header',{})#请求头,默认给一个空字典
cookie = kwargs.get('cookie',{})#cookie,默认给一个空字典
check = kwargs.get('check')
method = method.lower() #大小写转成小写,便于处理
try:
if method=='get':
res = requests.get(url,params=data,cookies=cookie,headers=header).text #预期结果
#因为接口有异常的情况下, 可能返回的不是json串,会报错
else:
res = requests.post(url,data=data,cookies=cookie,headers=header).text #预期结果
except Exception as e:
print('接口请求出错')
res = e #e接口返回的错误信息
#这种方式就是校验每个结果与预期结果比较,比较繁琐,必须校验返回值的时候可用
userid = check.get('userId') #返回的预期结果
error_code = check.get('error_code') #返回的预期结果code
if userid:
real_userid = res.get('login_info').get('userid')
self.assertEqual(userid,real_userid,'校验userid是否一致') #判断userid,real_userid是否一致,不一致返回错误信息
real_code = res.get('error_code')
self.assertEqual(error_code,real_code,'校验接口返回码是否一致') sutie = unittest.TestSuite() #实例化用例集合
sutie.addTest(unittest.makeSuite(Login)) #将Login函数添加进来
run = bf(sutie) #实例化报告
run.report('login_test','登录测试用例') #运行并生成报告文件
print(run.success_count) #通过的次数
print(run.failure_count) #失败的次数
over!
unittest自动化测试举例:自动读取ymal用例&调用接口并生成报告的更多相关文章
- 【原创】selenium+python+openpyxl实现登录自动化测试,自动读取excel用例数据,并将数据结果自动写入到excel
# -*- coding: utf-8 -*- from selenium import webdriver from openpyxl import load_workbook from time ...
- day11_单元测试_读取yaml文件中的用例,自动获取多个yaml文件内容执行生成报告
一.使用.yaml格式的文件直接可以存放字典类型数据,如下图,其中如果有-下一行有缩进代表这是个list,截图中是整体是一个list,其中有两部分,第二部分又包含另外一个list 二.单元测试:开发自 ...
- unittest自动化测试框架
目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式: unittest构建测试套件(测试用例集合): unittest忽略测试用例: 运行测试集 ...
- 18年selenium3+python3+unittest自动化测试教程(下)
第六章 自动化测试进阶实战篇幅 1.自动化测试实战进阶之网页单选性别资料实战 简介:讲解使用selenium修改input输入框和单选框 2.自动化测试之页面常见弹窗处理 简介:讲解使用seleniu ...
- C#_自动化测试 (四) 自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累. 安装和卸载完全可以做成自动化. 安装软件我们可以通过自动化框架,自动点击Next,来自动安装. 卸载软件我们可以通过msiexec命 ...
- BeautifulReport--适用于unittest自动化测试的可视化报告
安装: 因为是由大神分享的,可以直接在github<https://github.com/TesterlifeRaymond/BeautifulReport>上下载 git clone g ...
- Android自动读取短信验证码
Android自动读取短信验证码 extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...
- iOS:自动读取图片插件KSImageNamed-Xcode-master的使用
gitHub链接:https://github.com/ksuther/KSImageNamed-Xcode KSImageNamed-Xcode是一个Xcode插件,可以帮助开发者在Xcode中 ...
- C# 处理Word自动生成报告 三、设计模板
C# 处理Word自动生成报告 一.概述 C# 处理Word自动生成报告 二.数据源例子 C# 处理Word自动生成报告 三.设计模板 C# 处理Word自动生成报告 四.程序处理 既然是模板就少不了 ...
随机推荐
- git合并丢失代码问题分析与解决(错误操作导致)
问题描述 我们在主干dev和branch1分支上进行并行开发.当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了. 那么,是在branch1上,作了删除提交导致的吗 ...
- SSM获取前台参数的方式
1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...
- egret 发布ios记录
根据官方文档http://developer.egret.com/cn/github/egret-docs/Native/native/hybrid/hybrid/index.html 将现有的项目发 ...
- 使用idea实现SSM框架整合
SM框架整合 1 使用idea创建一个maven webapp项目 到此为止项目初步建立,需要等待maven对项目结构进行组织,直到状态栏的进度条完成,且项目的目录结构如下: 2 ...
- MongoDB入门_MongoDB安装与配置
MongoDB运行环境 MongoDB环境:CentOS-6.7-i386 MongoDB版本:MongoDB 2.6.5 ssh工具:xshell 文本编辑工具:vim与editplus++ 编译M ...
- Stylus-富有表现力的、动态的、健壮的CSS
今天总结一下Stylus记一些常用的也是最基本的用法 一. 选择器 Stylus是基于缩进的这让我们可以更快捷的编写css比如 body { margin:; paddind:; font-size ...
- adam优化
AdaGrad (Adaptive Gradient,自适应梯度) 对每个不同的参数调整不同的学习率, 对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新. gt表示第t时间步的梯 ...
- php内置函数分析range()
PHP_FUNCTION(range) { zval *zlow, *zhigh, *zstep = NULL, tmp; , is_step_double = ; double step = 1.0 ...
- SOJ 一句话题解整理
#50 离线+按位考虑 #99 %6拆成%2和%3合并+将图定向为DAG的方案数为 (-1)^n P(-1) #123 储存分数最后求逆元 #124 $\binom{2n}{n}$大概在25的时候就已 ...
- 【leetcode】1122. Relative Sort Array
题目如下: Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all elements in arr2 ar ...