2. unittest框架,jMeter
unittest框架,jMeter
unittest框架:
unittest-编写测试用例:
编写规则:
- 导入unittest模块,被测文件或者其中的类
- 创建一个测试类,并继承unittest.TestCase
- 定义测试函数,函数名以test_开头(表示一个测试用例)
- 测试用例中:
- 测试数据、期望结果
- 用例步骤
- 断言
断言方法:
方法 | 意思 | 检查 |
---|---|---|
assertEqual(a, b) | 判断两个参数是否相等 | a == b |
assertNotEqual(a, b) | 判断两个参数不相等 | a != b |
assertTrue(x) | 判断是否为真 | bool(x) is True |
assertFalse(x) | 判断是否为假 | bool(x) is False |
assertIs(a, b) | 判断a是否是b | a is b |
assertIsNot(a, b) | 判断a是否不是b | a is not b |
assertIsNone(x) | 判断是否为None | x is None |
assertIsNotNone(x) | 判断是否不为None | x is not None |
assertIn(a, b) | 判断b是否包含a | a in b |
assertNotIn(a, b) | 判断b是否不包含a | a not in b |
assertIsInstance(a, b) | 判断a是否为b类型 | isinstance(a,b) |
assertNotIsInstance(a, b) | 判断a是否不为b类型 | not isinstance(a,b) |
unittest-Fixture(测试环境创建和销毁):
测试用例级别的夹具:
- setUp(self)
- 测试用例的准备工作;
- 在每个测试用例运行前运行;
- tearDown(self)
- 测试用例的清理工作;
- 在每个测试用例运行后运行;
测试类级别的夹具:
- setUpClass(cls):
- 测试类的准备工作;
- 在类运行前运行;
- tearDownClass(cls):
- 测试类的清理工作;
- 在类运行结束运行;
- 在方法名上要加上@classmethod注解;
前置中的数据传递到测试用例当中去:
- 通过设置实例属性、类属性来传递;
unittest-收集用例:
简介:
- 测试用例会发布在不同的包、模块(.py)当中;
- 我们需要收集所有的测试用例,一并执行,并生成报告;
- 收集的方法:
- TestSuite类:测试用例集合;
- TestLoader类:测试用例收集;
- 使用TestLoader类收集用例,加载到TestSuite类当中;
- 最后执行TestSuite中的用例即可;
unittest - TestSuite套件:
- unittest.TestSuite()
- 添加用例到套件中的方法:
- 方法一:addTest(测试类名("用例名")) 添加一个测试用例
- 方法二:addTests([测试类名("用例名"), 测试类名("用例名")]) 添加一个测试用例的列表
unittest - TestLoader加载用例:
- 可通过类名、模块名、目录三种方式去收集用例到测试套件中:
- 方法一:目录(常用)
- unittest.TestLoader().discover(搜索目录) 默认在test*.py中搜索用例;
- 返回值就是测试套件的对象,无需添加到TestSuite类中;
- 方法二:类名(了解)
- unittest.TestLoader().loadTestsFromTestCase(测试类名);
- 注意:测试类名不需要加引号;
- 返回值是对应的测试用例,需要添加到TestSuite类中;
- 使用addTests()方法添加该测试用例;
- 方法三:模块名(了解)
- unittest.TestLoader().loadTestsFromModule(模块名);
- 注意模块名不需要加引号(要导入模块);
- 返回值是对应的测试用例,需要添加到TestSuite类中;
- 使用addTests()方法添加该测试用例;
unittest - defaultTestLoader加载用例:
- unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
test_dir
:这是你要搜索的测试用例所在的目录。pattern='test*.py'
:这是一个可选参数,用于指定搜索文件的模式。在这个例子中,它会搜索所有以"test"开头并且扩展名为".py"的文件。
main参数:
verbosity:
- 表示测试结果信息的复杂,共0、1、2三个值:
- 0:静默模式,获得总的测试用例数和总的结果,如10个用例,失败2,成功8
- 1:默认模式,在每个成功的用例前面有个点号,失败的用例前面加个F
- 2:详细模式,测试结果会显示每个测试用例的所有相关的信息
ddt扩展库:
简介:
- DDT(Data-Driven Tests)允许使用不同 的测试数据来运行一个测试用例,并将其展示为多个测试用例;
- 使用pip install ddt安装库;
- from ddt import ddt, data, file_data, unpack
- 用于实现功能,ddt有一个类修饰器,和三个方法修饰器;
修饰器:
类修饰器(@ddt)
- 要使用DDT,需要再测试类上添加@ddt修饰类;
方法修饰器(@data,@file_data,@unpack):
- @data:包含多个你想要传给测试用例的参数,可以为列表、元组、字典等;如果使用函数返回值需要再前加个
*
号; - @file_data:会从json或yaml中加载数据;(注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。如txt文件);
- @unpack:分割元素。(需要搭配unittest测试框架使用,实现数据驱动测试);
- 注意:@unpack修饰器搭配@data修饰器使用;
例子:
from ddt import ddt, data, file_data, unpack
@ddt
class MyddtTest(unittest.TestCase):
# 多个字典, 拆分
@data({"name":"peter","age":18,"addr":"chengdu"},{"name":"lily","age":19,"addr":"chengdu"})
@unpack
def test_07(self, name, age, addr):
print(name, age, addr)
# @file_data加载json文件
# **testdata:将提取到的数据存放在空字典testdata中
@file_data("config.json")
def test_10(self, **testdata):
# 再从字典testdata中单独提取参数
name = testdata['name']
age = testdata['age']
addr = testdata['addr']
print(testdata)
print(name, age, addr)
# 直接提取参数, test()方法中的参数必须与json文件中的键保持一致
@file_data("config.json")
def test_11(self,name, age, addr):
name = name
age = age
addr = addr
print(name, age, addr)
读取csv文件:
-
在Python中导入csv的类;
import csv
-
导入codecs类,使用这个类中的open方法,可以处理utf乱码;
-
使用csv中的reader的方法,来读取csv文件数据;在放入一个变量中;
-
csv.reader(codecs.open('d:/grade(utf-8)-d.csv', 'r', 'utf-8'))
-
使用循环遍历出该变量,存放到列表中,遍历出来的数据是列表,属于列表套列表;
-
islice()使用该函数,来遍历每一行
-
data = csv.reader(codecs.open('d:/grade(utf-8)-d.csv', 'r', 'utf-8')) value_rows = [] # 循环输出每行信息 for line in islice(data, 0, None): value_rows.append(line) return value_rows
生成测试报告:
jMeter:
线程组:
- setUp线程组:第一个运行的线程组;
- 线程组:普通的线程组;
- tearDown线程组:最后一个运行的线程组;
常见函数:
__counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器)
__Random 随机数函数 参数1: 取值范围最小值(包含) 参数2: 取值范围最大值(包含)
__time 获取当前时间的函数:
无参: 获取的是1970/01/01 00:00:00 到现在 的毫秒值
参数1: yyyy-MM-dd HH:mm:ss 格式化成 年-月-日 时:分:秒 格式
断言:
简介:
让程序代替人工判断响应结果是否符合预期;
步骤:
1.按照之前的实现编写测试脚本;
2.为被判断的取样器添加断言组件;
3.直接运行查看结果断言通过: 无提示; 断言失败: 给出错误
分类:
- 响应断言 = 断言状态码和响应体
- 大小断言 = 判断响应内容的字节长度
- 断言持续时间 = 断言响应时间
测试字段:
- 响应文本:提取数据后返回回来的数据;
- 响应代码:指http状态码;
- 响应信息:为Response message中的信息;
-
响应断言:
- 常用测试字段:响应文本和响应代码;
- 常用匹配规则:包括,相等;还有与之搭配使用的否,或者;
大小断言:
- 是按字节来判断大小;
- 响应字段为:完整响应、响应头、响应的信息体、响应代码、响应信息;
- 比较类型:=、!=、>、<、>=、<=;
- 比较的是字节大小,响应信息和响应代码,所写字数为字节,非内容;
逻辑控制器:
如果(if)控制器:
- 在线程组下添加if控制器,其取样器为if控制器的子级;
- 用于当if控制器的条件不为真,是不会执行取样器的;
- 语法格式:"变量"=="匹配的值",双引号是规定格式;
- 取消勾选第一个方括号;
forEach逻辑控制器:
- 线程组添加forEach控制器,子级添加取样器(控制器和取样器存在父子级关系);
- 用于遍历多个变量;
- 循环变量写法:前缀+下滑线+顺序数字;
循环控制器:
- 线程组添加forEach控制器,子级添加取样器(控制器和取样器存在父子级关系);
- 用于单独循环取样器;
事务控制器:
- 在线程组添加事务控制器,子级添加取样器(控制器和取样器存在父子级关系);
- 用于将多个请求合并为一个事务;一起完成或者一起失败;
关联提取器:
xpath提取器:
-
取样器添加提取器,取样器与提取器存在父子关系;
-
属于后置提取器,用于提取返回过来的数据;
-
通过xpath选择器来选择所需要的标签数据;
-
匹配数字表示匹配找到的第几个数据;
正则提取器:
-
取样器添加提取器,取样器与提取器存在父子关系;
-
属于后置提取器,用于提取返回过来的数据;
-
通过正则表达式来选择所需要的标签数据;
-
模板表示获得的第几个括号里面的数据;使用$1$:表示第1个括号
-
匹配数字表示匹配找到的第几个数据;
JSON提取器:
- 取样器添加提取器,取样器与提取器存在父子关系;
- 属于后置提取器,用于提取返回过来的数据;
- Names of created variables:是变量名,属于自定义;多个变量用
;
号分隔; - JSON Path expressions:JSON Path表达式;多个表达式用
;
号分隔;$.data,表示查询键为data的值,$固定写法,.号表示访问属性; - Match No:表示匹配出来的的第几个数据;0为随机,-1为所有值;
边界提取器:
- 响应字段:主体,信息头,响应代码和响应信息;
- 引用名称:就是存放的变量名;
- 提取的数据为,左边界和右边界包裹住的数据,不包括左右边界;
跨线程组关联:
简介:
- 变量作用域局限于当前线程组,其他线程组不可以直接调用。可以将请求A中提取的结果导出到公共空间(可以被不同线程组共享),请求B再从公开空间调用该变量,相当于全局变量;
使用方法:
- 使用setProperty函数来设置全局变量,然后生成对应的字符串;
- 属性名称:自定义的属性名,用于交个property函数;
- Value of property:需要设置为全局变量的值;
- 然后在线程组添加BeanShell 取样器,将setProperty函数生成的字符串写入里面;写在脚本中;
- 使用property函数来获取设置好的全局变量的字符串;
- 然后使用该变量即可;
同步定时器-高并发,也是集合点:
简介:
- 在取样器下添加同步定时器,来模拟同一时刻多人访问该接口;
- 在线程组中,添加多个线程表示多个人,然后定时器设置一组有多少人,然后从多个线程里面来计算多少个组;
- 超时时间,如果不设置,一组不满人是不会执行了;
拓展-聚合报告:
- 需要对结果进行汇总分析,使用聚合报告组件来自动分析;
固定定时器-设置思考时间:
- 设置线程延迟,就是设置思考时间,是以毫秒为单位;
常数吞吐量定时器-高频率:
- 在取样器下添加常数吞吐量定时器,来模拟一个时间段内,被访问的次数;
- 线程组中的循环次数表示次数;
非GUI界面运行并生成图像报告:
- 在安装jmeter目录下的bin目录下,进入命令提示符窗口;
- 指令为:
jmeter -n -t 指定运行的脚本文件 -l 指定结果文件路径 -e -o 生成的测试报告路径
提取接口文档三要素:
- 请求地址;
- 请求方式;
- 请求数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现