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自动生成报告 四.程序处理 既然是模板就少不了 ...
随机推荐
- iOS 审核app被拒绝的各种理由以及翻译
原 apps被拒绝的各种理由以及翻译:http://my.oschina.net/201003674/blog/356189#OSC_h1_3 1. Terms and conditions(法律与条 ...
- redis防止抢购商品超卖
前言: redis不仅仅是单纯的缓存,它还有一些特殊的功能,在一些特殊场景上很好用. 本篇博文用来测试下使用redis来防止抢购商品超卖问题. 内容: 使用redis的list进行测试 思路是设置一个 ...
- EFL - Championship
Swansea City Charlton AthleticBristol CityLeeds UnitedPreston North EndWest Bromwich AlbionQue ...
- 3Linux - 常用 Linux 命令的基本使用
常用 Linux 命令的基本使用 转自 目标 理解学习 Linux 终端命令的原因 常用 Linux 命令体验 01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作 ...
- Codeforces 960 二进制构造子序列 完全二叉树shift模拟 主席树/MAP DP
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...
- nginx_mirror_module流量复制在项目中的应用
参考文档:https://my.oschina.net/andChow/blog/2873870 https://blog.csdn.net/lancerh/article/details/88645 ...
- Python(3) 进制转换
2进制 :0b8进制: 0o16进制: 0x10进制:原来的数据 进制转换:bin() 方法:转化为 2进制 >>> bin(10)'0b1010'oct() 方法:转化为 8进制& ...
- 过采样算法之SMOTE
SMOTE(Synthetic Minority Oversampling Technique),合成少数类过采样技术.它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加 ...
- Flask之 请求,应用 上下文源码解析
什么是上下文? 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行,就要给所有的外部变量一个一个写 ...
- 【leetcode】1146. Snapshot Array
题目如下: Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) ini ...