2. unittest框架,jMeter

unittest框架,jMeter

unittest框架:

unittest-编写测试用例:

编写规则:
  1. 导入unittest模块,被测文件或者其中的类
  2. 创建一个测试类,并继承unittest.TestCase
  3. 定义测试函数,函数名以test_开头(表示一个测试用例)
  4. 测试用例中:
    1. 测试数据、期望结果
    2. 用例步骤
    3. 断言
断言方法:
方法 意思 检查
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(测试环境创建和销毁):

测试用例级别的夹具:
  1. setUp(self)
    • 测试用例的准备工作;
    • 在每个测试用例运行前运行;
  2. tearDown(self)
    • 测试用例的清理工作;
    • 在每个测试用例运行后运行;
测试类级别的夹具:
  1. setUpClass(cls):
    • 测试类的准备工作;
    • 在类运行前运行;
  2. tearDownClass(cls):
    • 测试类的清理工作;
    • 在类运行结束运行;
  3. 在方法名上要加上@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
    

生成测试报告:

image-20231227101347789

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中的信息;
  • image-20231220153659635
响应断言:
  • 常用测试字段:响应文本和响应代码;
  • 常用匹配规则:包括,相等;还有与之搭配使用的否,或者;
大小断言:
  • 是按字节来判断大小;
  • 响应字段为:完整响应、响应头、响应的信息体、响应代码、响应信息;
  • 比较类型:=、!=、>、<、>=、<=;
  • 比较的是字节大小,响应信息和响应代码,所写字数为字节,非内容;

逻辑控制器:

如果(if)控制器:
  • 在线程组下添加if控制器,其取样器if控制器的子级;
  • 用于当if控制器的条件不为真,是不会执行取样器的;
  • 语法格式:"变量"=="匹配的值",双引号是规定格式;
  • 取消勾选第一个方括号;
  • image-20231202215848580
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再从公开空间调用该变量,相当于全局变量;
使用方法:
  1. 使用setProperty函数来设置全局变量,然后生成对应的字符串;
    • 属性名称:自定义的属性名,用于交个property函数;
    • Value of property:需要设置为全局变量的值;
  2. 然后在线程组添加BeanShell 取样器,将setProperty函数生成的字符串写入里面;写在脚本中;
  3. 使用property函数来获取设置好的全局变量的字符串;
  4. 然后使用该变量即可;

同步定时器-高并发,也是集合点:

简介:
  • 在取样器下添加同步定时器,来模拟同一时刻多人访问该接口;
  • 在线程组中,添加多个线程表示多个人,然后定时器设置一组有多少人,然后从多个线程里面来计算多少个组;
  • 超时时间,如果不设置,一组不满人是不会执行了;
拓展-聚合报告:
  • 需要对结果进行汇总分析,使用聚合报告组件来自动分析;

固定定时器-设置思考时间:

  • 设置线程延迟,就是设置思考时间,是以毫秒为单位;

常数吞吐量定时器-高频率:

  • 在取样器下添加常数吞吐量定时器,来模拟一个时间段内,被访问的次数;
  • 线程组中的循环次数表示次数;
  • image-20231203014146106

非GUI界面运行并生成图像报告:

  • 在安装jmeter目录下的bin目录下,进入命令提示符窗口;
  • 指令为:jmeter -n -t 指定运行的脚本文件 -l 指定结果文件路径 -e -o 生成的测试报告路径
  • image-20231221175415349

提取接口文档三要素:

  • 请求地址;
  • 请求方式;
  • 请求数据
posted @   回家太晚太悲催  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示