【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦
背景
接上一篇,【大模型问答测试】大模型问答测试脚本实现(第一版)。
在实现自动化的时候,原先把很多方法与request请求写在一块了,趁着目前实现接口数量较少,决定对代码进行解耦,并且清晰目录结构,顺便接入pytest,为后续实现excel/yaml文件驱动以及接入allure测试报告做准备。
代码解耦
从git重新拉了一个分支,这样就确保不会影响到原来的代码,也便于代码的回滚
设计逻辑:将原先问答模块的代码拆分,拆分为发送request的模块以及相应的功能方法模块,便于后期进行维护与扩展
接入pytest
原先发送请求的模块暂调整为testCase里面,src核心代码模块先保留,后期设计发送各种请求模块,例如get与post请求,操作mysql模块以及数据驱动模块等等。
根据pytest的使用逻辑,进行接入pytest,pytest使用规则如下:
pytest使用规则
一、测试函数命名规则
测试函数必须以 test_ 开头。
例如:def test_addition():。只有以 test_ 开头的函数才会被 pytest 自动识别为测试函数并执行。
二、测试类命名规则
测试类必须以 Test 开头。
例如:class TestMyClass:。
测试类中的方法也需要遵循测试函数的命名规则,即以 test_ 开头,才能被识别为测试方法。
三、断言的使用
使用 assert 语句进行断言。
例如:assert result == expected,用于验证实际结果与预期结果是否一致。
如果断言失败,pytest 将报告详细的错误信息,包括失败的断言语句和实际值与预期值的差异。
四、命令行参数
运行测试时,可以使用各种命令行参数来控制测试的执行。
-v(或 --verbose):详细模式,显示更多的测试执行信息。
-s:允许测试中的标准输出(如 print 语句的输出)显示在终端上。
-k EXPRESSION:根据关键字表达式运行特定的测试。例如,pytest -k “addition” 将只运行名称中包含 “addition” 的测试。
-x:一旦遇到第一个失败的测试就停止运行。
–maxfail=N:在遇到 N 个失败的测试后停止运行。
五、Fixture 的使用
Fixture 是 pytest 中用于提供测试所需的资源或设置测试环境的机制。
使用 @pytest.fixture 装饰器定义 Fixture。
例如:
@pytest.fixturedef setup_data():return [1, 2, 3]
在测试函数中,可以将 Fixture 作为参数传入,以使用其提供的资源。
例如:def test_function(setup_data):,在这个测试函数中,可以使用 setup_data 参数来访问 Fixture 提供的数据。
六、参数化测试
使用 @pytest.mark.parametrize 装饰器可以实现参数化测试。
例如:
```python@pytest.mark.parametrize("input1, input2, expected", [(1, 2, 3),(4, 5, 9),(6, 7, 13)])def test_addition(input1, input2, expected):assert input1 + input2 == expected
这个测试函数将被多次执行,每次使用不同的参数组合。
七、测试用例组织
可以将相关的测试函数组织在同一个测试类中,或者将不同功能的测试放在不同的测试文件中。这有助于提高测试的可读性和可维护性。
八、跳过和标记测试
使用 @pytest.mark.skip 装饰器可以跳过某个测试。
例如:@pytest.mark.skip(reason=“测试功能尚未实现”)。
使用 @pytest.mark.xfail 装饰器标记一个预期会失败的测试。
当这个测试失败时,pytest 将报告它为 “预期失败”,而不是普通的失败。
九、插件的使用
pytest 有很多插件可以扩展其功能。
例如,pytest-html 插件可以生成 HTML 格式的测试报告。
安装插件后,可以在命令行中使用相应的参数来启用插件的功能。
十、配置文件
pytest 可以使用 pytest.ini 配置文件来设置一些全局的配置选项。
例如,可以在配置文件中设置测试的搜索路径、命令行参数的默认值等。
根据上面pytest规则的介绍,因此我们需要改动目录命名与类与方法的命名:
最后进行验证,代码正常执行
思考
其实接入pytest也是为后续使用Jenkins做CICD做准备,因为在配置cicd的时候,需要使用到一个启动的命令行,也就是需要进行配置,而pytest刚好又支持这种用法,因此也算是一拍即合
相关文章:

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦
背景 接上一篇,【大模型问答测试】大模型问答测试脚本实现(第一版)。 在实现自动化的时候,原先把很多方法与request请求写在一块了,趁着目前实现接口数量较少,决定对代码进行解耦,并且清晰目录…...

Windows模拟电脑假死之键盘鼠标无响应
Windows模拟电脑假死之键盘鼠标无响应 1. 场景需求 模拟Windows电脑假死,失去键盘鼠标响应。 2. 解决方案 采用Windows系统提供的钩子(Hook) API 拦截系统鼠标键盘消息。 3. 示例程序 【1】. 创建MFC对话框项目 新建一个MFC应用程序项目,项目名称…...
一文详解线程池
什么是线程池? 线程池:就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 为什么用线程池? 线程池的优势:线程池做的工作…...

网际报文协议ICMP及ICMP重定向实例详解2
之前在一个项目中遇到了与ICMP重定向相关的问题,因为缺乏对ICMP相关内容的了解,排查了很长一段时间才查出来。本文给大家简要地介绍一下ICMP及ICMP重定向相关的内容。 1、ICMP的概念 ICMP(Internet Control Message Protocol)网际…...
CSS 总结
CSS 总结 引言 CSS(层叠样式表)是网页设计中不可或缺的一部分,它用于控制网页的布局和样式。本文将对CSS的基本概念、关键特性、常用属性以及最佳实践进行总结,旨在帮助读者深入理解并有效运用CSS。 CSS基本概念 1. 什么是CSS? CSS是一种样式表语言,用于描述HTML或X…...

C语言_指针_进阶
引言:在前面的c语言_指针初阶上,我们了解了简单的指针类型以及使用,下面我们将进入更深层次的指针学习,对指针的理解会有一个极大的提升。从此以后,指针将不再是难点,而是学习底层语言的一把利器。 本章重点…...
chat_gpt回答:python使用writearray写tiff速度太慢,有什么快速的方法吗
如果你在使用 Python 的 tifffile 库(或类似库)写入 TIFF 文件时速度太慢,以下是几个加速写入的优化方法和替代方案: 1. 优化文件压缩设置 TIFF 支持压缩格式,但压缩过程可能非常耗时。如果你不需要压缩,…...

【时时三省】(C语言基础)函数介绍strcat
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 strcat 字符串追加 示例: 比如我要把world加到hello后面去 就可以用这个 还有一种方法是这样 这两个代码的意思是一样的 只是写法不一样 写的时候要注意这些 •源字符串必须…...

ESP32C3 开发板在Linux环境下,进行JTAG 调试演示-启明云端乐鑫代理商
JTAG 调试教程 本教程主要演示 esp32c3 开发板在 linux 环境下,通过 vscode 的 esp-idf 插件使用 jtag 调试工具。 esp32c3 不但内置了USB-JTAG,还内置了USB-SERIAL,仅需要一根USB线即可实现下载和调试仿真。 下面演示调试仿真的过程。 创…...

《计算机视觉》—— 基于PyCharm中的dlib库实现人脸关键点定位
文章目录 1. 安装必要的库2. 下载dlib的人脸检测器和关键点预测器模型3. 编写代码 人脸关键点定位是指通过计算机视觉技术,识别和定位人脸图像中的关键点,如眼睛、鼻子、嘴巴等特定位置。这些关键点的准确定位对于人脸识别、表情分析、姿态估计等应用具有…...

c++习题34-说谎
目录 一,题目 二,思路 三,代码 一,题目 描述 ljc以自己的人格担保他最后一个回答一定是正确的,但并不保证其它的回答是对的。 每个数为ljc对上一个的回答,若为0表示说上句话是错的,若为…...
如何使用Android Profiler进行性能分析?
Android Profiler是Android Studio中一个功能强大的性能分析工具,它可以帮助开发者实时监控应用的CPU、内存、网络、电量和图形渲染等性能指标,从而发现并解决性能瓶颈。以下是如何使用Android Profiler进行性能分析的详细步骤和技巧。 一、准备工作 安…...

整理—MySQL
目录 NOSQL和SQL的区别 数据库三大范式 MySQL 怎么连表查询 MySQL如何避免重复插入数据? CHAR 和 VARCHAR有什么区别? Text数据类型可以无限大吗? 说一下外键约束 MySQL的关键字in和exist mysql中的一些基本函数 SQL查询语句的执行顺…...

临时配置linux Bridge网桥
Linux Bridge(网桥)是用纯软件实现的虚拟交换机,有着和物理交换机相同的功能,例如二层交换,MAC地址学习等。因此我们可以把tun/tap,veth pair等设备绑定到网桥上,就像是把设备连接到物理交换机上…...

【Canvas与化学】铁元素图标
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>铁元素图标Draft1</title><style type"text/css"…...
list转map常用方法
利用Collectors.toMap收集指定属性 public Map<Long, String> getIdNameMap(List<Account> accounts) {return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername)); } 收集对象实体本身 - 在开发过程中我们也需要有时候对自己…...

C++容器适配器的模拟实现-stack、queue、priority_queue
### 容器适配器是将容器转换到其他容器自身不方便使用的地方,但是就容器适配器其本身还是包装的容器,所以这个类模板中各个接口的实现都是调用的容器的接口,因为容器适配器可能适配多个容器,所以这个类模板的模板参数中有一个参数…...

fastapi的docs页面是空白解决
环境:openEuler、python 3.11.6、fastapi 0.115.2 背景:居家办公,默认搭建的fastapi的docs接口为空白 时间:20241016 说明:网上很多教程的缺点是复杂(但是能够了解的更清楚),使用…...

浙大数据结构:11-散列4 Hashing - Hard Version
这道题主要在于思路,感觉像个模拟题,用到了线性探测的算法 机翻 1、条件准备 visit数组看这个位置有没有放进来数,num存非负整数,s存未到放入时机的数。 answer存答案。n为总共数量。 #include <iostream> #include<…...
pm2 守护http-server
PM2(Process Manager 2)是一个用于Node.js应用程序的进程管理器。以下是使用PM2守护HTTP服务器的步骤: 1. 安装PM2 如果你还没有安装PM2,可以使用以下命令安装: npm install pm2 -g 2. 启动HTTP服务器 你需要一个HTT…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...