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

news2024/9/19 10:51:50

在这里插入图片描述
代码已上传Python接口项目实战篇(2)源码

项目场景:

由于关于接口的测试用例任务越来越多,单纯靠人工手敲的方式输入和校验,速度上已经不能够满足项目的进行速度,而且都是针对登录的框框进行用例测试,如果后期测试用例高达数千条的话怎么办,有没有一种能够自动化解决的方案?

在这里插入图片描述

项目方案:

最终决定尝试使用unittest自动化框架+requests尝试解决这些接口方面的问题,并用HTMLTestRunner输出测试报告,于是就有了本篇的文章名字Python接口项目实战篇(2)unittest实现自动化网页登录接口测试,并用HTMLTestRunner输出测试报告
最终我需要实现的效果如下图所示

在这里插入图片描述

1.首先第一步导入包

这里要注意的是HTMLTestRunner直接安装pycharm是无法使用,有个方法说是放在python中的lib文件夹中,但是我尝试过后没有用所以只能用HTMLTestRunner3_New.py调用里面的类方法才能使用,这个我可以直接下载项目源代码里面有这个
代码已上传

import configparser
import os,time
import unittest,requests
from HTMLTestRunner3_New import HTMLTestRunner

2.执行本地文件地址拼接

当然直接使用绝对路径也是没问题,我这边需要使用一个自动生成名字而且

class Get_config_ini:
    def __init__(self,file):
        self.cf = configparser.ConfigParser()
        self.cf.read(file)
    def get_ini_test(self,a,c):
        values = self.cf.get(a,c)
        return values
a1_path = os.path.abspath(os.path.dirname(__file__))
a1 = Get_config_ini(os.path.join(a1_path,'Config.ini')).get_ini_test('a_path','ar_path')#获取本地的ini文件内的路径
a2_path = os.path.join(a1_path)

t_ime = time.strftime('%Y-%m-%H-%M-%S')#生成文件所需的时间
report_path = os.path.join(a2_path,t_ime+'report.html')#拼接文件名,这时文件还没有生成只是个名字

3.写unittest中测试用例执行框架

class login_test(unittest.TestCase):#定义一个类继承单元框架
    @classmethod
    def setUpClass(cls) -> None:
        print('用例测试开始')
    @classmethod
    def tearDownClass(cls) -> None:
        print('用例测试结束')
    def setUp(self) ->None:
        print('方法的开始')
    def tearDown(self) -> None:
        print('方法的结束')
    def test_1(self):
        print('测试用例1')
    def test_2(self):
        print('测试用例2')
    def test_3(self):
        print('测试用例3')
    def test_4(self):
        print('测试用例4')
    def test_5(self):
        print('测试用例5')
    def test_6(self):
        print('测试用例6')
    def test_7(self):
        print('测试用例7')
    def test_8(self):
        print('测试用例8')
    def test_9(self):
        print('测试用例9')
    def test_10(self):
        print('测试用例10')
class login_test(unittest.TestCase):#定义一个测试框架的类
    def test_1(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount':'admin','loginPwd':123456}
        reps = requests.post(url=url,headers=headers,data=data)
        print(reps.text)
    def test_2(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': '123Aa'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_3(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': '123456@@'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_4(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': ' '}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_5(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': '/.;'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_6(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': '一二三四五六'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_7(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': 'abcdefg'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_8(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': 'いち'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_9(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': '하나 둘 셋 넷 다섯 여섯'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)
    def test_10(self):
        url = 'http://192.168.52.129:8080/cms/manage/loginJump.do'
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {'userAccount': 'admin', 'loginPwd': 'адзін два тры чатыры пяць шэсць'}
        reps = requests.post(url=url, headers=headers, data=data)
        print(reps.text)

将测试用例添加进测试用例添加进容器对象中

def test():
    suit = unittest.TestSuite()#容器
    suit.addTests([login_test('test_1'), login_test('test_2'), login_test('test_3'),#容器对象
                   login_test('test_4'), login_test('test_5'), login_test('test_6'),
                   login_test('test_7'), login_test('test_8'), login_test('test_9'),
                   login_test('test_10')])
    p = open(report_path, 'wb')
    run = HTMLTestRunner(stream=p, title='登录接口报告', description='执行概况如下', tester='for_you')
    run.run(suit)

4.创建程序入口

if __name__ == '__main__':
	 test()

执行一下看下效果,unittest框架根据我们写的测试用例自动进行测试在这里插入图片描述
测试完毕输出测试报告,内容也很详细,如果有调用测试登录接口失败的情况也会写出来,目前暂时没有无法调用的接口,通过数也是全部都通过。
在这里插入图片描述

5.当然我们也可以使用unittest统计项目中有多少个被执行过得测试用例总计

在这里插入图片描述

6.统计项目中有多少个被执行过得测试用例

只要给出对应项目地址和目前当前py文件的地址就会对这些曾经被执行过得测试用例进行统计

def logjum():
    discre = unittest.defaultTestLoader.discover(start_dir=a1_path,pattern='g.py')
    p = open(report_path,'wb')#打开被执行过的文件
    run = HTMLTestRunner(stream=p,title='CMS总计报告',description='执行情况',tester='for_you')
    run.run(discre)

7.将unittest中的统计测试用例功能添加进去

if __name__ == '__main__':
    if os.access(report_path,os.F_OK) ==True:
        print('文件已存在,执行统计操作')
        logjum()
    else:
        print('文件不存在执行生成操作')
        test()
        if os.access(report_path, os.F_OK) == True:
            print('文件已存在,执行统计操作')
            test()

这里要注意一下unittest的总计是对目前当前已执行过的测试用例数进行统计,没有执行过的测试用例是无法被统计

而且这里需要确定被统计的文件是否存在,因为需要进行读取当前被统计的文件,然后才能进行写入操作然后进行统计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一站式轻监控轻运维系统nezha(下篇)

本文软件由网友 114514 推荐; 命令行安装 docker安装所需要的文件都能在 https://github.com/naiba/nezha/tree/master/script 找到,config.yaml 和 docker-compose.yml 老苏都做了调整 你可以在 data 目录中新建一个空的 config.yaml 文件,…

基于“Doris”的type2拉链表的Mysql实现

基于“Doris”的type2拉链表的Mysql实现 需求说明 基于Doris实现Type2、拉链表。主要对上游系统里的面积字段进行监控,如果发现变化则跟踪记录到维度表里。 解决方案 type2相关概念见如下链接: SCD缓慢变化维拉链表 这里特别需要注意的是: 1、因为…

scrapy_redis原理分析并实现断点续爬以及分布式爬虫

scrapy_redis原理分析并实现断点续爬以及分布式爬虫 学习目标 了解 scrapy实现去重的原理了解 scrapy中请求入队的条件掌握 scrapy_redis基于url地址的增量式单机爬虫掌握 scrapy_redis分布式爬虫 1. 下载github的demo代码 clone github scrapy-redis源码文件 git clone http…

WPF TotalSummary汇总栏设置鼠标点击事件和显示格式修改

文章目录最开始的提示汇总有两种Summary Panel的设置参考这里Fixed Summary Panel的设置参考这里代码中都用到了DXBinding多个汇总项,对某一项进行控制设置鼠标点击事件整体的xaml代码如下总结最开始的提示 WPF毕竟是微软的东西,且用的人不多&#xff0…

虚函数的复杂(继承)内存布局

文章目录单继承(无虚函数覆盖)单继承(有虚函数覆盖)多继承(无虚函数覆盖)多继承(有虚函数覆盖)菱形继承(有虚函数覆盖)菱形虚拟继承(有虚函数覆盖…

浅析git

目录 git 的历史 git 的感性认识 git 在Linux下的操作 git三板斧 git 的历史 雷纳斯托瓦兹,想必大家对这个名字并不陌生,他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者&#xff0c…

Kafka入门(一)

1、Kafka简介 Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域(hadoop集群)、物联网领域。其主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能…

华为路由器Talent服务配置

前言 Telnet:console是通过本地进行设备管理,还有一种是通过远程登录的方式进行设备管理,也就是虚拟终端。通过发送信息进行控制,不受终端和服务器的位置限制(只要可以通信,服务器启用了Telnet功能即可&am…

Python 的基础语法

第一个 Python 程序交互式编程交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下:$ pythonPython 2.7.6 (default, Sep 9 2014, 15:04:36)[GCC 4.2…

LinkedHashSet源码阅读理解

概述 1、底层:HashSet LinkedHashMap 2、创建节点时将节点插入链表,因此有序 3、线程不安全 源码理解 demo: public class LinkedHashSetDemo {public static void main(String[] args) {test();}public static void test(){LinkedHas…

CDMP认证考试考前你需要了解的那些事

对国内的数据从业人员来说,CDMP算比较新的考试,目前相关介绍很少,小编整理了CDMP考试先关的一些内容,希望对正在考虑考取CDMP认证的你有所帮助!CDMP认证有几个等级?4个。A级(基础级)…

为什么Google优化排名前期要做长尾关键词?谷歌seo怎么做?

本文主要分享关于谷歌长尾词对于外贸网站获取流量和排名的重要性。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 Google优化排名是指在Google 搜索结果中,使外贸站的排名更高。 长尾关键词是指长度较长的,不…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第2天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有65天

🏆🏆🏆🏆🏆🏆🏆 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录&a…

【计算机网络】Linux下路由配置总结

文章目录路由的基础知识Linux内核路由表使用route -n命令查看Linux内核路由表三种路由类型说明(Flags)配置路由route的命令设置包转发静态路由配置参考路由的基础知识 1)路由概念 路由: 跨越从源主机到目标主机的一个互联网络来转发数据包的过程路由器…

多线程代码案例之单例模式

目录 单例模式 饿汉模式 懒汉模式 问题一 问题二 问题三 单例模式 单例模式,是设计模式的一种。在有些特定场景中,有的特定的类,只能创建出一个实例,不应该创建多个实例。单例模式就可以保证这样的需求。例如JDBC中的Data…

OpenMMLab AI实战营笔记前两次课

文章目录1计算机视觉算法基础与 OpenMMLabCV引入OpenMMLab基础知识:2 计算机视觉之图像分类算法基础传统方法--设计图像特征AlexNet VGG 等神经网络搜索(2016)Vision/Swin Transformer轻量化卷积神经网络注意力机制 Attention Mechanism模型学…

文档存储Elasticsearch系列--3分布式存储和搜索过程

前言:ES 作为分布式文档的存储,它的存储过程是怎样的,它的分布式检索过程又是怎样的; 1 分布式存储过程: 为了说明目的, 我们 假设有一个集群由三个节点组成。 它包含一个叫 blogs 的索引,有两个主分片&a…

linux查看/设置某个进程运行的CPU核

目录 1.ps -eF 2.top命令 3.pidstat命令 4.使用taskset指令 5.使用taskset指定进程运行在CPU核 1.ps -eF #查看fwd进程运行在哪个cpu核上 [rootCENTOS57 rpm]# ps -eF | grep fwd 2.top命令 (1)top (2)按f键可以选择下面配置选项 P Last Used Cpu (SMP) (3)Es…

【深度学习】YOLO系列(v1-v3+tinyv3)解析

YOLOv1 正负样本选取 如果目标的中心落在cell中,那么这个cell就负责预测这个类别。 由于每个cell预测两个bbox,那么选择与GT IOU大的bbox来预测这个目标,也就是这一个框的 1 i j o b j = 1 , 1 i j n o b j

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、前言 这是一个全部的脚本,我们知道,…