Pytest教程:一种利用 Python Pytest Hook 机制的软件自动化测试网络数据抓包方法

随着计算机技术的发展,使得网络应用的数量不断增加,因此网络数据抓包成为了网络应用开发和测试中非常重要的一部分。目前,已有许多网络数据抓包工具可供使用,例如 Wireshark、Tcpdump、Fiddler 等,但这些工具需要手动配置过滤器和网卡信息,而且不能直接将抓到的数据与软件自动化测试结合起来进行分析。因此,本文旨在提出一种利用 Python Pytest Hook 机制的软件自动化测试网络数据抓包方法,在保证网络数据抓包准确性与效率的同时,实现了网络数据抓包与软件自动化测试的结合。

Pytest:是一个用于Python的全功能测试框架,它使编写和执行单元测试、集成测试和功能测试变得更加容易。 Pytest可以充分利用Python的强大功能,提供了很多有用的功能和特性,支持自动发现、模块化测试、参数化、插件扩展、并发执行、测试结果报告等。

Hook:在软件工程中,Hook也称为钩子,是一种基于事件驱动的技术,它可以实现在程序运行某个关键时刻自动执行特定的代码。Hook通常用于在应用程序的生命周期中注册或处理事件,并在特定事件发生时触发相应的回调函数。在Pytest中,Hook也称为钩子函数,是Pytest的一种扩展机制,用于定制和扩展Pytest的功能。Pytest提供了很多默认的Hook函数,可以被Python类或函数实现,以扩展和修改Pytest的默认行为。通过实现Hook函数,我们可以在Pytest的测试流程中进行各种自定义操作,例如:修改测试配置、选择执行的测试用例、在测试用例执行前后执行特定的代码、自定义测试报告等等。本文就是利用了Pytest Hook机制在测试用例执行前后执行特定的代码来实现抓包相关功能的。

我们提出了一种利用 Python Pytest Hook 机制的软件自动化测试网络数据抓包方法。致力于解决使用Pytest时无法按需要同步对测试过程的一个或多个网络数据进行抓包的缺点。

本文针对使用Python Pytest Hook机制实现软件自动化测试网络数据抓包方法给出一种有效的解决方案示例,不需要手动配置网卡信息也不依赖第三方软件,而是通过实现Pytest插件的方式注册到Pytest的执行流程中,通过Hook机制影响Pytest运行自动化测试的流程从而实现在测试执行过程中同步对网络数据进行抓取。

                                                        Pytest Hook 抓包执行流程图

网络数据抓包过程随着测试进程的开始而开始,随着测试进程的退出而结束,抓包的数据会在电脑本地以.pcap格式进行存储,并且pcap文件个数和名称均与测试用例保持一致。

  1. 导入必要的Python库:pytest、scapy、netifaces,其中scapy 是一个功能强大的 Python 库,用于创建、发送和解析网络数据包。它提供了一种简单而灵活的方式来操作网络层、传输层和应用层协议,使我们能够自定义和控制网络通信。netifaces 是一个 Python 库,用于获取和操作网络接口信息。它提供了一种简单的方式来查询和检索系统上的网络接口信息,包括 IP 地址、网络掩码、网关、MAC 地址等。
  2. 定义MyPlugin 类,该类是 Pytest 插件的主体,MyPlugin 类作为Pytest的插件可以通过注册、加载和Hook函数实现功能的扩展和定制化,与Pytest的API进行交互,如下图所示:

MyPlugin 类图

2.1首先创建MyPlugin类中的属性

  1. lock:一个线程锁,用于在多线程环境中保证数据的安全访问。
  2. envConfig: 存储环境配置的文件路径。
  3. test_pkts: 一个列表,存储捕获到的包。
  4. test_recordDataPath: 存储 pcap 文件的路径。
  5. test_caseName: 测试用例的名称。
  6. test_sniffStopFlag: 指示是否停止包的捕获的标志。
  7. test_sniffList: 存储要捕获的网卡名称的列表。
  8. test_thread_List: 存储线程对象的列表。
  9. recordFlag: 记录 pcap 文件序号的变量。
  10. tmpFlag: 记录临时 pcap 文件序号的变量。

2.2 进一步创建MyPlugin类中的方法

  • _write_cap(): 定义一个方法,用于将捕获到的包添加到 test_pkts 列表中,并根据 pcapThreshold(抓包文件拆分阈值) 的值进行 pcap 临时文件的保存,pcapThreshold是记录在config.txt文件中的一个配置项,使用者可以根据自己电脑配置情况进行设置,默认40000,抓包过程中会在文件到达60MB左右时进行拆包,最后进行聚合,数值越小,拆包会越频繁,如果电脑剩余内存不够,可以适当调小该值。总的来说这个方法的作用就是在保证使用者电脑内存资源安全的前提下不断的做网络抓包数据存储的操作。

config.txt配置文件的格式为:

[sniffManager]

pcapfilter = "not port 22 and not port 80 and not port 8080"

pcapthreshold = 40000

  • _stopfilter(): 定义一个方法,判断是否需要停止包的捕获。由于抓包动作是随着测试开始而开始的,并且是在一个不会影响测试主流程的多线程环境下执行的,因此除了做到与测试同步结束之外,还应该提供一个由使用者控制的停止方法,_stopfilter就是为此而设计的,它可以被使用者在测试过程中的任意位置调用,从而实现整体的抓包操作停止。默认情况下我们采用的是跟随自动化测试流程的启动和停止方法。
  • _sniffmsg(): 定义一个方法,自动获取网卡信息并保存配置到一个名为envConfig.py的配置文件中,用于捕获指定网卡上的包,并调用 _write_cap 方法将包保存到 pcap 文件。该方法是抓包功能的核心,它将调用_write_cap、_stopfilter以及一个抓包过滤配置,该方法启动后将会以阻塞的形式不间断的对指定的网卡进行网络数据抓包操作。

envConfig.py配置文件格式为:

ETH = {

'name': '以太网',

'record': 'Y',

'ip': 'xxx.xxx.xxx.xxx',

'netmask': '255.255.255.0',

'gateway': "('xxx.xxx.xxx.xxx',)",

'dns': "('xxx.xxx.xxx.xxx', 'xxx.xxx.xxx.xxx')"

}

  • _start_logger(): 定义一个方法,创建一个线程池用来调用_sniffmsg执行抓包操作,因为_sniffmsg会阻塞当前程序,所以使用多线程来解决这个问题,使其不会影响Pytest测试主程序的执行,这里使用多线程还有一个考虑,那就是通常较为复杂的测试场景中,使用者的电脑可能不止一块网卡,所以该方法实现了根据网卡个数来分配线程资源,从而实现多网卡的抓包操作。
  • _save_pcap(): 定义一个方法,用于保存 pcap 文件。这里会分阶段对保存的pcap文件进行管理,主要实现了两大功能一是管理并命名拆分的抓包过程文件,二是最终以测试用例的名称对抓包文件进行聚合和重命名,目的是保证整个抓包过程中使用者电脑的资源消耗是最低的且一旦出现意外退出时能够做到最大化的抓包数据留存,使用者不再需要在测试过程中还要对抓包数据进行备份、重命名、分开存储这些操作。
  • pytest_sessionstart(): pytest 框架的Hook函数,用于在测试会话开始之前进行初始化操作,这里主要用于启动网络抓包动作_start_logger。
  • pytest_runtest_teardown(): pytest 框架的Hook函数,用于在每个测试用例结束之后调用保存 pcap 文件的逻辑。
  • pytest_sessionfinish(): pytest 框架的Hook函数,用于在测试会话结束之后进行资源清理操作,如用于存放网络数据的test_pkts以及线程资源等。
  • 对不想抓包的端口在配置文件config.txt中进行过滤设置,配置格式如下:

pcapfilter = "not port 22 and not port 80 and not port 8080"

4.启动 pytest 框架,运行测试用例,并注册MyPlugin插件:pytest.main(args=argList,plugins=[MyPlugin(recordDataPath)]),这里我们将MyPlugin类通过pytest.main的启动函数中的plugins传入,在此之前还需要对recordDataPath参数进行设置,该参数用于指定最终网络抓包数据文件的存放路径。

5.自动化测试用例结束后得到结合自动化测试用例执行的网络数据pcap文件。

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

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

相关文章

进程的学习

进程基本概念: 1.进程: 程序:存放在外存中的一段数据组成的文件 进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息(根据CPU占用率排序&#xf…

PHY6222系统级SOC蓝牙芯片低功耗高性能蓝牙MESH组网智能家居

简介 PHY6222是一款支持BLE 5.2功能和IEEE 802.15.4通信协议的系统级芯片(SoC),集成了超低功耗的高性能多模射频收发机,搭载32-bit ARM?Cortex?-M0处理器,提供64K retention SRAM、可选128K-8M Flash、96KB ROM以及2…

十、线性代数二-线性相关

目录 1、线性相关的概念: 2、线性相关的代数表示: 3、线性相关的判断方法: 理解:线性相关指的是 向量组(α1,α2,α3,...)的 秩是 小于 k 的元数的,即齐次…

第二节:Vben Admin 登录逻辑梳理和对接后端准备

系列文章目录 上一节:第一节:Vben Admin介绍和初次运行 文章目录 系列文章目录前言项目路径的概述一、登录逻辑梳理loginApi接口查看Mock 二、后端程序对接准备关闭Mock 总结 前言 第一节,我们已经配置了前端环境,运行起来了我们…

文献速递:深度学习--深度学习方法用于帕金森病的脑电图诊断

文献速递:深度学习–深度学习方法用于帕金森病的脑电图诊断 01 文献速递介绍 人类大脑在出生时含有最多的神经细胞,也称为神经元。这些神经细胞无法像我们身体的其他细胞那样自我修复。随着年龄的增长,神经元逐渐死亡,因此变得…

el-form 表单文本标签label增加tooltip提示图标

需求&#xff1a;在el-form表单中&#xff0c;el-form-item的文本标签处增加提示语&#xff1b; 标签&#xff1a;el-form、el-form-item、el-tooltip&#xff1b; 实现&#xff1a; <el-form-item prop"basicScore"><span slot"label"><…

nginx之状态页 日志分割 自定义图表 证书

5.1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 server{…

【Git】Git命令的学习与总结

本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站&#xff0c;可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox&#xff0c;自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区&#xff08;staging area&#xff…

采访影视行业人“Sora入局,或将改变游戏规则?”

自OpenAI发布Sora已经过去了半个月&#xff0c;人们对于这个新兴的“文生视频”&#xff08;text-to-video&#xff09;大模型工具都已经有了初步的认识&#xff0c;经过半个月的沉淀&#xff0c;他们也陆续发布了一些更加令人震惊的demo&#xff0c;话不多说&#xff0c;我们先…

Bootstrap引入和使用

Bootstrap 基础用法 目录 Bootstrap 基础用法什么是Bootstrap&#xff1f;引入Bootstrap布局容器栅格系统表格样式表单样式text样式按钮样式图标 什么是Bootstrap&#xff1f; Bootstrap是一个开源的前端框架&#xff0c;用于对HTML和CSS代码进行封装&#xff0c;因此可以直接…

Springboot集成Druid实现监控功能

Druid是阿里巴巴开发的号称为监控而生的数据库连接池&#xff0c;在功能、性能、扩展性方面&#xff0c;都超过其他数据库连接池&#xff0c;包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等&#xff0c;秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况&#…

打破数据孤岛,推动销售与财务协同升级!

客户介绍&#xff1a; 某科技有限公司是一家高科技公司&#xff0c;致力于为客户提供智能显示、物联网、云计算等领域的技术解决方案和产品。公司拥有强大的技术实力和研发团队&#xff0c;在业内享有盛誉。 客户痛点&#xff1a; 该公司在业务发展过程中&#xff0c;遇到了以…

如何在Window搭建Odoo并发布公网实现远程办公【内网穿透】

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

win11家庭版安装Docker启动一直Starting the Docker Engine...

越多越多的应用通过Docker方式来运行&#xff0c;确实Docker方式运行也很方便&#xff0c;都是一个独立的运行环境&#xff0c;部署也很方便。于是决定安装下Docker试试&#xff0c;之前用Docker的时候还是win10&#xff0c;现在win11了。 安装倒是可以安装上&#xff0c;但是…

TextCNN:文本分类卷积神经网络

模型原理 1、前言2、模型结构3、示例3.1、词向量层3.2、卷积层3.3、最大池化层3.4、Fully Connected层 4、总结 1、前言 TextCNN 来源于《Convolutional Neural Networks for Sentence Classification》发表于2014年&#xff0c;是一个经典的模型&#xff0c;Yoon Kim将卷积神…

蓝桥杯-答疑

原题链接&#xff1a;用户登录 答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。一位同学答疑的过程如下 1.首先进入办公室&#xff0c;编号为 的同学需要 s&#xff0c;…

ChatGPT调教指南 | 咒语指南 | Prompts提示词教程(三)

在人工智能成为我们日常互动中无处不在的一部分的时代&#xff0c;与大型语言模型(llm)有效沟通的能力是无价的。“良好提示的26条原则”为优化与这些复杂系统的交互提供了全面的指导。本指南证明了人类和人工智能之间的微妙关系&#xff0c;强调清晰、专一和结构化的沟通方法。…

如何修改图片尺寸大小不变形?简单的图片改大小的方法

在平时工作或者学习时&#xff0c;有时候需要将图片的大小进行修改&#xff0c;以便于存储、分享或打印&#xff0c;很多人都习惯性的去下载一些图片处理软件&#xff0c;比较麻烦&#xff0c;这里推荐大家使用图片在线处理工具&#xff0c;打开浏览器直接将图片尺寸修改&#…

C语言--贪吃蛇

目录 1. 实现目标2. 需掌握的技术3. Win32 API介绍控制台程序控制台屏幕上的坐标COORDGetStdHandleGetConsoleCursorinfoCONSOLE_CURSOR_INFOSetConsoleCursorInfoSetConsoleCursorPositionGetAsyncKeyState 4. 贪吃蛇游戏设计与分析地图<locale.h>本地化类项setlocale函…

windows查看并关闭端口对应进程占用的命令

原因&#xff1a;使用代码对3000端口监听&#xff0c;想关掉不想重启 1、根据端口号3000查看对应进程号 netstat -ano | findstr 3000可以看出进程号13940 2、结束进程 taskkill /pid 13940 -t -f //taskkill /pid [进程码] -t(结束该进程) -f(强制结束该进程以及所有子进…