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.mfbz.cn/a/414626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G网络频谱划分与应用

频率越大,波长越短。补充:微波频段:300MHZ~3000GHZ。 5G网络工作频带与带宽配置 (1) FR1:410MHZ~7125MHZ。 FR2:24250MHZ~52600MHZ 注:早期将6GHZ已下频段作为FR1,但是最新的频段…

Python打发无聊时光:10.用flask创造按键控制的网页小游戏

游戏介绍: 《秦蓝大冒险》是一款简单而紧张的追逐游戏。在这个游戏中,玩家将控制一名名叫“吕千”的角色,试图在一个封闭的空间内逃避一个名为“秦蓝”的追逐者。随着时间的推移,“秦蓝”会不断追踪玩家的位置,努力捕捉到他。 游…

C语言中如何进行内存管理

主页:17_Kevin-CSDN博客 收录专栏:《C语言》 C语言是一种强大而灵活的编程语言,但与其他高级语言不同,它要求程序员自己负责内存的管理。正确的内存管理对于程序的性能和稳定性至关重要。 一、引言 C 语言是一门广泛使用的编程语…

2.1_6 线程的实现方式和多线程模型

文章目录 2.1_6 线程的实现方式和多线程模型(一)线程的实现方式(1)用户级线程(2)内核级线程 (二)多线程模型(1)一对一模型(2)多对一模…

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程 AI浪潮袭来,还是学习学习为妙赛博菩萨【秋葉】简介——(葉ye,四声,同叶)A绘世启动器.exe(sd-webui-aki-v4.6.x)工具包安…

VirtualBox虚拟机配置双网卡

安装完后Linux后。下一步需要设置Linux的网络。为了便于学习测试,通常我们需要虚拟机能通宿主机和外网。类似达到下面的效果。虚拟机跟宿主本机和外网,及另外一台同网段的虚拟机也是相通 解决思路是-->配置双网卡,网卡1使用NAT网络模式&a…

vue组件中data为什么必须是一个函数

查看本专栏目录 关于作者 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas&#x…

fiddler抓包工具使用(一)

一、fiddler简介 1. 简介 fiddler是一款强大的抓包工具,它的原理以web代理服务器的形式进行工作fiddler是好用的web调试工具之一 能记录所有客户端和服务器的http和https请求修改输入、输出数据包数据允许监视设置断点弱网测试 2. 工作原理 代理就是在客户端和服…

QT C++实战:实现用户登录页面及多个界面跳转

主要思路 一个登录界面,以管理员Or普通用户登录管理员:一个管理员的操作界面,可以把数据录入到数据库中。有返回登陆按钮,可以选择重新登陆(管理员Or普通用户普通用户:一个主界面,负责展示视频…

java动态代理面试题,java反射原理面试题

01 并发宝典:面试专题 面试专题分为四个部分,分别如下 Synchronized 相关问题 可重入锁 ReentrantLock 及其他显式锁相关问题 Java 线程池相关问题 Java 内存模型相关问题 1.1 Synchronized 相关问题(这里整理了八问) 问题一…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏,知来者犹可追 …

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁👊 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 💝 问题背景 大家好,我是寸铁&#xff01…

C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义,即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢?所以同一个函数名的函数之间肯定是要存在不同点的,除了函数名外,还有返回类型和参数两部分可以…

前后端项目-part03

文章目录 5.4.4 机构名称5.4.4.1 创建实体类Company5.4.4.2 创建实体类CompanyMapper5.4.4.3 创建实体类CompanyService5.4.4.4 创建实体类CompanyController5.4.4.5 后端测试5.4.4.6 修改basic.js5.4.4.7 修改course.vue5.4.4.8 测试5.4.5 课程标签5.4.5.1 效果5.4.5.2 修改co…

golang学习5,glang的web的restful接口

1. //返回json r.GET("/getJson", controller.GetUserInfo) package mainimport (/*"net/http"*/"gin/src/main/controller""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/get", func(ctx *…

【Linux系统化学习】信号概念和信号的产生

目录 信号的概念 从生活中的例子中感知信号 前台进程和后台进程 前台进程 后台进程 操作系统如何知道用户向键盘写入数据了? 进程如何得知自己收到了信号? 信号捕捉 signal函数 Core Dump(核心转储) 信号产生的方式 通…

如何选择合适的汽车芯片ERP系统?

随着汽车产业的飞速发展,汽车芯片作为关键组件,其管理变得愈发重要。为了高效管理汽车芯片的生产、销售、库存等各个环节,许多企业开始引入汽车芯片ERP(企业资源规划)系统。那么,如何选择合适的汽车芯片ERP系统呢? 明确需求是关键…

react-JSX基本使用

1.目标 能够知道什么是JSX 能够使用JSX创建React元素 能够在JSX中使用JS表达式 能够使用JSX的条件渲染和列表渲染 能够给JSX添加样式 2.目录 JSX的基本使用 JSX中使用JS表达式 JSX的条件渲染 JSX的列表渲染 JSX的样式处理 3.JSX的基本使用 3.1 createElement()的问题 A. …

小红书3C家电行业种草营销策略打法,纯干货

小红书作为国内种草营销的鼻祖,拥有庞大的年轻用户群体,特别是在3C家电行业,小红书的种草营销效应更是明显。据相关数据显示,小红书3C家电行业的用户关注度持续攀升,尤其是90后和00后,他们对新鲜事物的接受…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号,单个字符 转义字符是一种特殊的字符变量,以反斜线开头,后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…
最新文章