Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告

2023-10-26

在这里插入图片描述这些是之前的文章,里面有一些基础的知识点在前面由于前面已经有写过,所以这一篇就不再详细对之前的内容进行描述
Python自动化测试实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功

Python自动化测试实战篇(2)unittest实现批量接口测试,并用HTMLTestRunner输出测试报告

源码已上传,有需要的可以自行下载
Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出测试报告
本篇主要就是对之前的代码进行优化,虽然之前已经实现了批量的用例测试,但是由于实在是过于繁琐和非常多的重复代码,虽然像接口地址和header这些重复性的内容可以放在另一个地方用于储存,但是还需要写大量重复的内容。
在这里插入图片描述

所以本篇主要就是结合ddt+yaml来进行对这些重复的而又繁杂的代码进行优化,将用例需要测试的内容封装起来放到外部,实现可重复使用

ddt的使用在于减少重复性的接口测试请求,为了更方便管理测试用例,所以还需要将用例存放在yaml中,这样对于大量的测试用例管理来说是非常方便的,本次用于登录测试的接口依然还是之前的cms系统,这一次将测试用例再次增加10条用于测试用户账户,具体如图
在这里插入图片描述

1.创建yaml文件

yaml语法为:
冒号+空格 就是字典里面的key和value,
冒号+冒号 代表是一个对象,这里的冒号可以为空,
杠(-)加数据代表列表,
杠杠(–)加数据代表列表里面的列表
创建一个名字为lojump的yaml文件
将需要测试用例的信息放进去,一共是20条

- user: admin
  pwd: 123456
  tst: 't01调用成功,登陆成功返回所有的登录信息'
- user: admin
  pwd: 123Aa
  tst: 't02调用成功,返回登录失败信息'
- user: admin
  pwd: 123456@@
  tst: 't03调用成功,返回登录失败信息'
- user: admin
  pwd: ''
  tst: 't04调用成功,返回登录密码不能为空'
- user: admin
  pwd: '/.;'
  tst: 't05调用成功,返回登录失败信息'
- user: admin
  pwd: '一二三四五六'
  tst: 't06调用成功,返回登录失败信息'
- user: admin
  pwd: 'abcdefg'
  tst: 't07调用成功,返回登录失败信息'
- user: admin
  pwd: 'いち'
  tst: 't08调用成功,返回登录失败信息'
- user: admin
  pwd: '하나 둘 셋 넷 다섯 여섯'
  tst: 't009调用成功,返回登录失败信息'
- user: admin
  pwd: 'адзін два тры чатыры пяць шэсць'
  tst: 't10调用成功,返回登录密码不能为空'
- user: 123456
  pwd: 123456
  tst: 't11调用成功,返回登录密码不能为空'
- user: 123Aa
  pwd: ''
  tst: 't12调用成功,返回登录失败信息'
- user: 123456@@
  pwd: 123456
  tst: 't13调用成功,返回登录失败信息'
- user: 【】
  pwd: 123456
  tst: 't14调用成功,返回登录失败信息'
- user: /.;
  pwd: 123456
  tst: 't15调用成功,返回登录失败信息'
- user: 一二三四五六
  pwd: 123456
  tst: 't16调用成功,返回登录失败信息'
- user: abcdefg
  pwd: 123456
  tst: 't17调用成功,返回登录失败信息'
- user: いち
  pwd: 123456
  tst: 't18调用成功,返回登录失败信息'
- user: 하나 둘 셋 넷 다섯 여섯
  pwd: 123456
  tst: 't19调用成功,返回登录失败信息'
- user: адзін два тры чатыры пяць шэсць
  pwd: 123456
  tst: 't20调用成功,返回登录失败信息'

2.实现unittest+ddt对yaml里面的用例进行测试

1.导入ddt包

from ddt import ddt,data,unpack #导入数据驱动

2.class类上加上修饰符@ddt,

在这里插入图片描述

3.导入全部包

import yaml 
import os 
import unittest,requests
from ddt import ddt,data,unpack 

4.读取yaml文件

f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)

5.设置固定的url和headers

url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}

6.定义一个测试用例

@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
if __name__ == '__main__':
    unittest.main()

7.完整代码

目前来看代码相对简短了很多,从之前的128行代码缩短到目前的18行代码,如果将其他固定的如url和headers封装到其他文件里面去的话代码会更少

import yaml #导入yaml模块获取yaml文件值
import os #导入路径拼接
import unittest,requests
from ddt import ddt,data,unpack #导入数据驱动
f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)
url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
if __name__ == '__main__':
    unittest.main()

返回的结果
在这里插入图片描述

3.输出HTMLTestRunner测试报告

1.确定本地路径

当然你也可以直接写一个绝对地址路径也没关系

a1_path = os.path.abspath(os.path.dirname(__file__))

2.生成时间戳

import time
t_ime = time.strftime('%Y-%m-%H-%M-%S')

3.拼接时间和要生成的本地文件

  report_path = os.path.join(a1_path, t_ime+'测试报告.html')

4.执行搜索本地用例

带*表示g之后的都执行搜索

discre = unittest.defaultTestLoader.discover(start_dir=a1_path,pattern='g*.py')

5.写入本地文件

p = open(report_path,'wb')

6.执行生成HTMLTestRunner测试报告

run = HTMLTestRunner(stream=p,title='CMS总计报告',description='执行情况',tester='you')
    run.run(discre)

7.最后在if name == ‘main’:中执行

logjum()的位置一定要在unittest.main之前才能执行成功

if __name__ == '__main__':
    logjum()
    unittest.main()

8.最终生成的HTMLTestRunner测试报告结果

在这里插入图片描述
可以正常显示我们所需要的测试结果
在这里插入图片描述

9.完整代码

import yaml #导入yaml模块获取yaml文件值
import os #导入路径拼接
import unittest,requests
from ddt import ddt,data,unpack #导入数据驱动
from HTMLTestRunner3_New import HTMLTestRunner
import time
f=open(os.path.join('D:\pythonpj\pytest\lojump.yaml'),'r',encoding='utf-8')
ts_et=yaml.safe_load(f)
url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
# report_path = os.path.join(a1_path,'测试报告.html')
@ddt
class lg(unittest.TestCase):
    @data(*ts_et)
    @unpack
    def test_logjump(self,**dict):#定义一个测试用例
        reps=requests.post(url=url,headers=headers,
                        data={'userAccount':dict['userAccount'],
                        'loginPwd': dict['loginPwd']})
        print(reps.text)
def logjum():
    t_ime = time.strftime('%Y-%m-%H-%M-%S')
    a1_path = os.path.abspath(os.path.dirname(__file__))
    report_path = os.path.join(a1_path, t_ime+'测试报告.html')
    discre = unittest.defaultTestLoader.discover(start_dir=a1_path,pattern='g*.py')
    p = open(report_path,'wb')
    run = HTMLTestRunner(stream=p,title='CMS总计报告',description='执行情况',tester='you')
    run.run(discre)
if __name__ == '__main__':
    logjum()
    unittest.main()

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告 的相关文章

  • 使用 OpenCV 和/或 Numpy 对两个图像进行 Alpha 混合 [重复]

    这个问题在这里已经有答案了 我想将一个填充纯色的半透明矩形添加到已加载的半透明 PNG 中 这是我正在使用的输入图像示例 该图像加载了标准cv2 IMREAD UNCHANGED标志 以便完美保留 alpha 通道 该输入图像存储在imag
  • pandas Wide_to_long 后缀参数

    我对在 pandas 中使用 Wide to long 时的参数有疑问 有一个参数叫suffix我不明白 在文档中它说 后缀 str 默认 d 捕获所需后缀的正则表达式 d 捕获数字后缀 没有数字的后缀可以用否定字符类 D 指定 您还可以进
  • ca 证书 Mac OS X

    我需要在emacs 上安装offlineimap 和mu4e 问题是配置 当我运行 Offlineimap 时 我得到 OfflineIMAP 6 5 5 Licensed under the GNU GPL v2 v2 or any la
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • Paramiko SSHException 通道已关闭

    我一直在使用 Paramiko 在 Linux Windows 机器上发送命令 它可以很好地在 Ubuntu 机器上远程执行测试 但是 它不适用于 Windows 7 主机 以下是我收到的错误 def unit for event self
  • 在Python中以交互方式执行多行语句

    我是 Python 世界的新手 这是我用 Python 编写的第一个程序 我来自 R 世界 所以这对我来说有点不直观 当我执行时 In 15 import math import random random random math sqrt
  • NumPy 和 SciPy - .todense() 和 .toarray() 之间的区别

    我想知道使用是否有什么区别 优点 缺点 toarray vs todense 在稀疏 NumPy 数组上 例如 import scipy as sp import numpy as np sparse m sp sparse bsr mat
  • scikit-learn 和tensorflow 有什么区别?可以一起使用它们吗?

    对于这个问题我无法得到满意的答案 据我了解 TensorFlow是一个数值计算库 经常用于深度学习应用 而Scikit learn是一个通用机器学习框架 但它们之间的确切区别是什么 TensorFlow 的目的和功能是什么 我可以一起使用它
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得
  • 如何将类添加到 LinkML 中的 SchemaDefinition?

    中的图表https linkml io linkml model docs SchemaDefinition https linkml io linkml model docs SchemaDefinition and https link
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • Python:无法使用 os.system() 打开文件

    我正在编写一个使用该应用程序的 Python 脚本pdftk http www pdflabs com tools pdftk the pdf toolkit 几次来执行某些操作 例如 我可以在 Windows 命令行 shell 中使用
  • Pip 无法在 Windows 上安装 Twisted

    我正在尝试在 Windows 8 计算机上安装 Twisted 在 Twisted 官方网站上 只有一个 Windows 版的 Wheel 文件 https twistedmatrix com trac wiki Downloads htt
  • 如何使用 Pandas Series 绘制两个不同长度/开始日期的时间序列?

    我正在绘制 每周总事件 的几个熊猫系列对象 系列中的数据events per week看起来像这样 Datetime 1995 10 09 45 1995 10 16 63 1995 10 23 83 1995 10 30 91 1995
  • 如何从 nltk 下载器中删除数据/模型?

    我在 python3 NLTK 中安装了一些 NLTK 包 通过nltk download 尝试过它们 但不需要它们 现在想删除它们 我怎样才能删除例如包large grammars来自我的 NLTK 安装 我不想删除完整的 NLTK 安装

随机推荐

  • OpenGL 红宝书 反走样 雾 点参数 多边形偏移

    6 2 反走样 void glHint GLenum target GLenum hint 控制OpenGL的某些行为 参数target是要控制的行为 参数hint可以是GL FASTEST GL NICEST GL DONT CARE 效
  • 组成原理---中断

    文章目录 中断的基本概念 中断请求与判优 中断响应 中断服务与返回 中断系统是计算机中实现中断功能的软 硬件总称 一般在 CPU 中配置中断机构 在外设接口中配置中断控制器 在软件上设计相应的中断初始化程序和中断服务程序 中断的基本概念 在
  • python从入门到精通 第一节 数据类型

    Python 中的变量不需要声明 每个变量在使用前都必须赋值 变量赋值以后该变量才会被创建 在 Python 中 变量就是变量 它没有类型 我们所说的 类型 是变量所指的内存中对象的类型 等号 用来给变量赋值 等号 运算符左边是一个变量名
  • 分布式锁的实现与应用

    为什么需要锁 在多任务环境下解决并发场景的数据竞争问题 Java常见锁 我们可以根据锁是否包含某一特性来进行分组归类 从线程是否对资源加锁 可以将锁分为乐观锁和悲观锁 从资源已被锁定时 线程是否阻塞 可以分为自旋锁 JUC下的atomic家
  • react实现计数器

    var In display gt div display div var Btn click gt
  • 同页面javascript中文参数传递

    修改前
  • VMware Workstation 14 Pro 安装 Windows Server 2003(完)

    一 下载镜像文件 Windows Server 2003有多种版本 每种都适合不同的商业需求 Windows Server 2003 Web Edition WindowsServer2003Web版 用于构建和存放Web应用程序 网页和X
  • Python入门的20个基础练习

    01 Hello World python的语法逻辑完全靠缩进 建议缩进4个空格 如果是顶级代码 那么必须顶格书写 哪怕只有一个空格也会有语法错误 下面示例中 满足if条件要输出两行内容 这两行内容必须都缩进 而且具有相同的缩进级别 pri
  • sqli - labs - Less 17

    我们先来看看源码 这里我们可以看到 首先进行上传数据的判断 但是 uname是通过上面的check input函数进行相关过滤所以用户名必须要正确 密码可以忽略 所以本关在密码这里找到突破口 可以看出在得到row变量之后 如果不为空 代码将
  • STM32跳至硬件错误中断(HardFault_Handle)

    1 遇到错误问题是数据类型不对 导致该步骤永远不能执行到 跳至硬件错误中断 所以硬件中断可尝试查找数据类型错误 2 堆栈设置错误也会跳至hardwarefault 3 如果上电后 在调试时 执行单步 会在不确定位置的地方产生HardFaul
  • 基于OpenCV的手势识别完整项目(Python3.7)

    这是我的本科毕设题目 刚开始接触机器学习这方面 感谢CSDN和GitHub上的大佬 网上类似项目很多 方法也有很多 自己顺带进行了整理 边做毕设边分享一下自己学习心得吧 也算是梳理一下所学知识 各大佬有什么好的建议还请指出 不吝赐教 项目简
  • Qt的槽函数崩溃问题

    当Qt的槽函数是一个lambda表达式时 如果传入的方法为引用传递 而你又在lambda表达式里使用了外面定义的stl或类 那么就会崩溃 这是因为Qt的槽函数是一个轮询的过程 第一次你进入这个表达式结束时会进行一次自动析构 第二次进入这个l
  • linux删除文件后没有释放空间

    系统 centos 7 现象 早上收到阿里云短信 发现一台服务器的磁盘空间使用率达到90 昨天晚上已经加了定时任务 难道没有啥用 无奈的我打开电脑 解决 由于已经解决 当时没有截图 查看磁盘空间 df h 找到对应文件 进行删除 rm fi
  • yaml文件的读写

    官方使用文档 https yaml cpp docsforge com 写入 include
  • addr2line命令

    在Linux下写C C 程序的程序员 时常与Core Dump相见 在内存越界访问 收到不能处理的信号 除零等错误出现时 我们精心或不精心写就的程序就直接一命呜呼了 Core Dump是Linux仁慈地留下的程序的尸体 帮助程序员们解决了一
  • Layout Object Tree 创建

    站在老罗的肩膀上 https blog csdn net luoshengyang article details 50615628 每一个HTML标签在DOM Tree中都有一个对应的HTMLElement节点 相应地 在DOM Tree
  • java集合框架--集合接口

    java 集合框架使程序处理集合数组的方法标准化 集合框架包含了一组标准的接口 对这些接口 提供了几个标准的实现工具 LinkedList HashSet 和 TreeSet 集合接口 接口 描述 Collection 集合框架的顶层接口
  • JAVA中sort()函数的使用方法的个人总结

    1 sort 函数的基本格式 默认排序为升序排序 Arrays sort int a int fromIndex int toIndex Arrays sort 数组名 起始下标 终止下标 一个简单的排序例子 import java uti
  • PCB绘制常用规范

    PCB包含四个文件 原理图 原理图库 封装库文件 PCB文件 首先新建一个PCB工程 File gt New gt Project gt PCBProject 1 原理图文件 name SchDoc File gt new gt Schma
  • Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告

    这些是之前的文章 里面有一些基础的知识点在前面由于前面已经有写过 所以这一篇就不再详细对之前的内容进行描述 Python自动化测试实战篇 1 读取xlsx中账户密码 unittest框架实现通过requests接口post登录网站请求 JS