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://xiahunao.cn/news/2812132.html

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

相关文章

Nodejs 第四十二章(jwt)

什么是jwt? JWT(JSON Web Token)是一种开放的标准(RFC 7519),用于在网络应用间传递信息的一种方式。它是一种基于JSON的安全令牌,用于在客户端和服务器之间传输信息。 https://jwt.io/ JWT由三部分组成&…

VUE基础知识九 ElementUI项目

ElementUI官网 一 项目 最终完成的效果: 切换上边的不同按钮,下方显示不同的表格数据 在src/components下新建不同业务组件的文件夹 1.1 搭建项目 使用脚手架搭建项目后,引入ElementUI(搭建、引入ElementUI步骤在第七节里已…

现代信号处理学习笔记(二)参数估计理论

参数估计理论为我们提供了一套系统性的工具和方法,使我们能够从样本数据中推断总体参数,并评估估计的准确性和可靠性。这些概念在统计学和数据分析中起着关键的作用。 目录 前言 一、估计子的性能 1、无偏估计与渐近无偏估计 2、估计子的有效性 两个…

Vue-Cropper头像裁剪插件使用

1. 效果预览 2. 插件介绍 官网地址:[GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue](https://github.com/xyxiao001/vue-cropper?fromthosefree.com) 3 . 插件使用 下载插件 npm install vue-croppernext3 . 封装好的代码&#x…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件,适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具,包括音频录制、编辑、混音以及MIDI制作等功能,帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

使用Scrapy将数据提取到数据库中,进行处理

我们将数据处理的方式,最开始csv文件 再到与数据库建立联系 代码: Spider: import scrapyclass ShuangseqiuSpider(scrapy.Spider):name "shuangseqiu"allowed_domains ["sina.com.cn"]start_urls ["https://view.lottery…

[NOIP2011 普及组] 数字反转

AC代码&#xff1a; #include<iostream>using namespace std;int main() {long long n;cin >> n;long long temp n;long long sum 0;while(temp ! 0){int c temp % 10;sum sum * 10 c;temp temp / 10;}printf("%lld",sum);return 0; }

vue3 + vite + ts 中使用less文件全局变量

文章目录 安装依赖新建css变量文件全局引入css变量文件使用css变量 一、安装依赖 npm install less less-loader --save-dev 二、新建CSS变量文件 (1) :在根目录下的src文件中 src-> asset -> css ->glibal.less // glibal.less :root{--public_background_font_Col…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile&#xff1a; Sandbox2D.h:ProfileResult结构体和ProfileResult容器&#xff0c;存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

python中的数字类型Number

Python 数字(Number) Python 数字数据类型用于存储数值。 数据类型是不允许改变的&#xff0c;这就意味着如果改变数字数据类型的值&#xff0c;将重新分配内存空间。 以下实例在变量赋值时 Number 对象将被创建&#xff1a; var1 1 var2 10Python 支持三种不同的数值类型…

蜣螂优化算法DBO求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

SQL注入之order by脚本盲注

一、环境 还是用上次搭建的sql-labs靶机环境 搭建sql注入环境 二、什么是order by盲注 在有的时候我们进行sql注入时&#xff0c;源码的查询语句后面为order by&#xff1b; 众所周知&#xff0c;order by 后面接的字段或者数字不一样&#xff0c;那么这个数据表的排序就会…

嵌入式学习第二十一天!(线程)

线程&#xff1a; 1. 基本概念&#xff1a; 线程&#xff1a;线程是一个轻量级的进程&#xff0c;位于进程空间内部&#xff0c;一个进程中可以创建多个线程 2. 线程创建&#xff1a; 线程独占栈空间&#xff0c;文本段、数据段和堆区与进程共享 3. 线程调度&#xff1a; 与进程…

探索比特币现货 ETF 对加密货币价格的潜在影响

撰文&#xff1a;Sean&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 自美国比特币现货交易所交易基金&#xff08;ETF&#xff09;上市以来&#xff0c;比特币现货 ETF 的相关信息无疑成为了影响比特币价格及加密货币市场走向…

Java四大引用详解:强引用、软引用、弱引用、虚引用

在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在商店购买了某样物品后&#xff0c;如果有用就一直保留它&#xff0c;否则就把它扔到…

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 光照的原理光源吸收和散射着…

LinkedList的使用(Java)

目录 一、介绍二、LinkedList的使用1、LinkedList的构造2、 LinkedList的其他常用方法介绍3、LinkedList的遍历 三、ArrayList和LinkedList的区别 一、介绍 LinkedList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的节点…

开发知识点-.netC#图形用户界面开发之WPF

C#图形用户界面开发 框架简介WinForms(Windows Forms):WPF(Windows Presentation Foundation):UWP(Universal Windows Platform):MAUI(Multi-platform App UI):选择控件参考文章随笔分类 - WPF入门基础教程系列基于C#语言的GUI开发,主要介绍WPF框架