软件测试学习笔记丨Pytest+Allure测试计算器

news2024/9/20 20:20:28

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/31954

项目要求

3.1 项目简介

计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算,将正确的结果展示在屏幕上。 可帮助人们更方便的实现数字运算。一般情况下计算器除显示计算结果外,还常有溢出指示、错误指示等功能。

3.1.1 知识点

  • 测试流程与需求分析
  • bug 提交与管理
  • Pytest 测试框架基本用法
  • 参数化
  • 异常处理
  • 标签、跳过用例
  • 结合 Allure 生成测试报告与项目总结
  • 数据驱动
  • pytest fixture 实现测试装置及参数化
  • pytest conftest.py 的用法
  • pytest 文件配置 pytest.ini
  • 使用第三方插件控制用例的执行顺序,分布式并发执行
  • 使用分层思想,实现框架的合理构建
  • 了解内置插件 hook 体系,实现插件开发

3.1.2 受众

  • 资深测试工程师

3.1.3 作业内容

  1. 完整的测试流程,包含需求分析、测试计划设计、测试用例编写、测试执行、bug 的提交与管理。
  2. 使用思维导图完成需求分分析;提供完整测试计划模板,完成测试计划设计;应用多种测试用例设计方法,包括:等价类、边界值、错误推测法等。
  3. 测试执行过程中应用多种测试方法完成计算器的加法、除法运算。
  4. 结合项目管理工具完成 bug 的提交与管理,进行测试报告编写与项目总结。
  5. 编写自动化测试用例,结合 Allure 与截图技术等自动生成带截图与操作步骤的测试报告。
  6. 使用参数化减少代码量,提高代码的可维护性。
  7. 使用 mark 标签为测试用例分类
  8. 设置跳过、预期失败用例
  9. 对异常用例进行处理
  10. 掌握 Pytest 常用的装饰器,例如:添加标签、参数化、Fixture 等。
  11. 掌握 Pytest 自动化测试框架多种复杂配置,比如 pytest.ini 配置、conftest.py 配置等。
  12. 合理使用第三方插件,控制测试用例的执行顺序、分布式并发执行等场景。
  13. 掌握分层思想实现用例的分层,实现测试装置,测试数据,测试日志,测试报告等合理的框架构建。
  14. 开发一个插件,实现命令行传递参数

3.1.4 被测源码

class Calculator:
    def add(self, a, b):

        if a > 99 or a < -99 or b > 99 or b < -99:
            print("请输入范围为【-99, 99】的整数或浮点数")
            return "参数大小超出范围"

        return a + b

    def div(self, a, b):
        if a > 99 or a < -99 or b > 99 or b < -99:
            print("请输入范围为【-99, 99】的整数或浮点数")
            return "参数大小超出范围"

        return a / b

3.2 实现过程

3.2.1 代码提交

3.2.2 需求分析

3.2.3 测试计划(简版)

3.2.4 测试用例设计

3.2.5 Pytest自动化测试设计

  • utils.py
from pandas.tests.io.excel.test_openpyxl import openpyxl

class Utils:

    @classmethod
    def get_excel_data(cls, excel_path, sheetname):
        """
        读取 excel文件中指定 sheet 页的数据
        :param excel_path: excel文件的路径
        :param sheetname: sheet页的名称
        :return: 返回读取的数据
        """
        # 打开 Excel 文件
        book = openpyxl.load_workbook(excel_path)
        # 获取指定名称的工作表
        sheet = book[sheetname]
        # 初始化一个空列表,用于存储行数据
        values = []
        for row in sheet.iter_rows(values_only=True):
            values.append(row)
        return values
  • test_add_excel.py
import sys
import pytest
import os
import allure
from Calculator_Project.base.base import Base
from Calculator_Project.utils.log_util import logger
from Calculator_Project.utils.utils import Utils

# 定义一个获取加法数据的函数,接收一个参数 level
@pytest.mark.parametrize("type",
                         ["有效等价类", "无效等价类", "边界值", "错误推测"]
                         )
def get_add_data(type):
    """
    读取加法的测试数据
    :param type: 用例类型
    :return: 对应优先级的测试数据和 ids
    """
    # 获取当前文件的系统路径
    root_path = os.path.dirname(os.path.abspath(__file__))
    # 打印当前文件的系统路径
    print(f"当前系统路径:{root_path}")
    # 拼接 Excel文件的路径
    excel_path = os.sep.join([root_path, '..', 'datas', 'calculator.xlsx'])
    # 打印 Excel文件的路径
    print(f"excel文件路径:{excel_path}")
    sheetname = "加法"
    # 获取 Excel 数据
    excel_data = Utils.get_excel_data(excel_path, sheetname)
    # 打印 Excel 数据
    print(excel_data)
    # 初始化空列表,用于存储对应的测试数据
    datas = []
    ids = []
    # 遍历数据行,跳过标题行
    for row in excel_data[1:]:
        # 获取对应 level 优先级的数据
        if row[0] == type:
            datas.append([row[1], row[2], row[3]])  # 返回 a, b, expect
            ids.append(row[4])  # 返回 ids
    # 返回测试数据和测试标题的数组
    return [datas, ids]

# 设置allure报告的模块名称
@allure.epic("计算器测试")
# 设置allure报告的模块名称
@allure.feature("计算器加法测试")
# 定义一个加法测试类,继承自Base类
class TestAddExcel(Base):

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=1)
    # 设置allure报告的用户故事
    @allure.story("加法-有效等价类的用例")
    # 使用 pytest的参数化装饰器,将get_add_datas("有效等价类")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a, b, expect", get_add_data("有效等价类")[0], ids=get_add_data("有效等价类")[1]
    )
    # 定义一个测试加法的方法,接收3个参数:a, b, expect
    def test_add_valid(self, a, b, expect):
        # 添加图片
        allure.attach.file("./datas/pic2.jpg",
                           name="计算器图片2",
                           attachment_type=allure.attachment_type.JPG,
                           extension="JGP")
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}+{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.add(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=4)
    # 设置allure报告的用户故事
    @allure.story("加法-无效等价类的用例")
    # 使用 pytest的参数化装饰器,将get_add_datas("无效等价类")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a,b,expect", get_add_data("无效等价类")[0], ids=get_add_data("无效等价类")[1]
    )
    # 定义一个测试加法的方法,接收3个参数:a, b, expect
    def test_add_unvalid(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}+{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.add(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=2)
    # 设置allure报告的用户故事
    @allure.story("加法-边界值的用例")
    # 使用 pytest的参数化装饰器,将get_add_datas("边界值")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a, b, expect", get_add_data("边界值")[0], ids=get_add_data("边界值")[1]
    )
    # 定义一个测试加法的方法,接收3个参数:a, b, expect
    def test_add_boundary(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}+{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.add(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=3)
    # 设置allure报告的用户故事
    @allure.story("加法-错误推测的用例")
    # 使用 pytest的参数化装饰器,将get_add_datas("错误推测")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a,b,expect", get_add_data("错误推测")[0], ids=get_add_data("错误推测")[1]
    )
    # 定义一个测试加法的方法,接收3个参数:a, b, expect
    def test_add_type_error(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 捕获预期的异常
        with pytest.raises(eval(expect)) as e:
            # 设置allure报告的测试步骤
            with allure.step(f"1. 调用被测程序进行计算{a}+{b}={expect}"):
                # 测试步骤:调用被测应用进行计算
                result = self.calculator.add(a, b)
            # 记录计算结果的日志信息
            logger.info(f"实际计算结果为:{result}")
            # 记录捕获的异常信息
            logger.info(f"类型错误为:{e}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{e.type} == {TypeError}"):
            assert e.type == TypeError

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=5)
    # 设置始终跳过的测试用例
    @pytest.mark.skip
    def test_error_message(self):
        print("详细提示信息未完成开发,暂不测试。")
        assert True

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=7)
    # 设置特定条件下跳过的测试用例
    @pytest.mark.skipif(sys.platform == "darwin", reson = "不做mac的兼容")
    def test_sys(self):
        print("Mac系统不做兼容测试")
        assert True

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=6)
    # 预期失败的测试用例
    @pytest.mark.xfail
    def test_fail(self):
        print("标记期望失败的案例,还没想好哪些失败。。。")
        assert True
  • test_div_excel.py
import sys
import pytest
import os
import allure
from Calculator_Project.base.base import Base
from Calculator_Project.utils.log_util import logger
from Calculator_Project.utils.utils import Utils

# 定义一个获取除法数据的函数,接收一个参数 level
@pytest.mark.parametrize("type",
                         ["有效等价类", "无效等价类", "边界值", "错误推测", "被除数为0"]
                         )
def get_div_data(type):
    """
    读取除法的测试数据
    :param type: 用例类型
    :return: 对应优先级的测试数据和 ids
    """
    # 获取当前文件的系统路径
    root_path = os.path.dirname(os.path.abspath(__file__))
    # 打印当前文件的系统路径
    print(f"当前系统路径:{root_path}")
    # 拼接 Excel文件的路径
    excel_path = os.sep.join([root_path, '..', 'datas', 'calculator.xlsx'])
    # 打印 Excel文件的路径
    print(f"excel文件路径:{excel_path}")
    # 获取 Excel 数据
    excel_data = Utils.get_excel_data(excel_path, "除法")
    # 打印 Excel 数据
    print(excel_data)
    # 初始化空列表,用于存储对应的测试数据
    datas = []
    ids = []
    # 遍历数据行,跳过标题行
    for row in excel_data[1:]:
        # 获取对应 level 优先级的数据
        if row[0] == type:
            datas.append([row[1], row[2], row[3]])  # 返回 a, b, expect
            ids.append(row[4])  # 返回 ids
    # 返回测试数据和测试标题的数组
    return [datas, ids]

# 设置allure报告的模块名称
@allure.epic("计算器测试")
# 设置allure报告的模块名称
@allure.feature("计算器除法测试")
# 定义一个除法测试类,继承自Base类
class TestDivExcel(Base):

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=1)
    # 设置allure报告的用户故事
    @allure.story("除法-有效等价类的用例")
    # 使用 pytest的参数化装饰器,将get_div_datas("有效等价类")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a, b, expect", get_div_data("有效等价类")[0], ids=get_div_data("有效等价类")[1]
    )
    # 定义一个测试除法的方法,接收3个参数:a, b, expect
    def test_div_valid(self, a, b, expect):
        # 添加图片
        allure.attach.file("./datas/pic1.jpg",
                           name="计算器图片1",
                           attachment_type=allure.attachment_type.JPG,
                           extension="JGP")
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}/{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.div(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=4)
    # 设置allure报告的用户故事
    @allure.story("除法-无效等价类的用例")
    # 使用 pytest的参数化装饰器,将get_div_datas("无效等价类")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a,b,expect", get_div_data("无效等价类")[0], ids=get_div_data("无效等价类")[1]
    )
    # 定义一个测试除法的方法,接收3个参数:a, b, expect
    def test_div_unvalid(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}/{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.div(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=2)
    # 设置allure报告的用户故事
    @allure.story("除法-边界值的用例")
    # 使用 pytest的参数化装饰器,将get_div_datas("边界值")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a, b, expect", get_div_data("边界值")[0], ids=get_div_data("边界值")[1]
    )
    # 定义一个测试除法的方法,接收3个参数:a, b, expect
    def test_div_boundary(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 设置allure报告的测试步骤
        with allure.step(f"1. 调用被测程序进行计算{a}/{b}={expect}"):
            # 测试步骤:调用被测应用进行计算
            result = self.calculator.div(a, b)
        # 记录计算结果的日志信息
        logger.info(f"实际计算结果为:{result}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{result} == {expect}"):
            # 断言实际结果是否与预期结果一致
            assert result == expect

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=3)
    # 设置allure报告的用户故事
    @allure.story("除法-错误推测的用例")
    # 使用 pytest的参数化装饰器,将get_div_datas("错误推测")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a,b,expect", get_div_data("错误推测")[0], ids=get_div_data("错误推测")[1]
    )
    # 定义一个测试除法的方法,接收3个参数:a, b, expect
    def test_div_type_error(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 捕获预期的异常
        with pytest.raises(eval(expect)) as e:
            # 设置allure报告的测试步骤
            with allure.step(f"1. 调用被测程序进行计算{a}/{b}={expect}"):
                # 测试步骤:调用被测应用进行计算
                result = self.calculator.div(a, b)
            # 记录计算结果的日志信息
            logger.info(f"实际计算结果为:{result}")
            # 记录捕获的异常信息
            logger.info(f"类型错误为:{e}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{e.type} == {TypeError}"):
            assert e.type == TypeError

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=5)
    # 设置allure报告的用户故事
    @allure.story("除法-被除数为0的用例")
    # 使用 pytest的参数化装饰器,将get_div_datas("被除数为0")的结果解包成多个参数值,生成测试用例
    @pytest.mark.parametrize(
        "a, b, expect", get_div_data("被除数为0")[0], ids=get_div_data("被除数为0")[1]
    )
    # 定义一个测试除法的方法,接收3个参数:a, b, expect
    def test_div_zero(self, a, b, expect):
        # 记录测试用例参数的日志信息
        logger.info(f"a={a}, b={b}, expect={expect}")
        # 捕获预期的异常
        with pytest.raises(eval(expect)) as e:
            # 设置allure报告的测试步骤
            with allure.step(f"1. 调用被测程序进行计算{a}/{b}={expect}"):
                # 测试步骤:调用被测应用进行计算
                result = self.calculator.div(a, b)
            # 记录计算结果的日志信息
            logger.info(f"实际计算结果为:{result}")
            # 记录捕获的异常信息
            logger.info(f"类型错误为:{e}")
        # 设置allure报告的测试步骤
        with allure.step(f"2. 断言{e.type} == ZeroDivisionError"):
            assert e.type == ZeroDivisionError

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=8)
    # 设置始终跳过的测试用例
    @pytest.mark.skip
    def test_error_message(self):
        print("详细提示信息未完成开发,暂不测试。")
        assert True

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=7)
    # 设置特定条件下跳过的测试用例
    @pytest.mark.skipif(sys.platform == "darwin", reson = "不做mac的兼容")
    def test_sys(self):
        print("Mac系统不做兼容测试")
        assert True

    # 设置测试用例的执行顺序
    @pytest.mark.run(order=6)
    # 预期失败的测试用例
    @pytest.mark.xfail
    def test_fail(self):
        print("标记期望失败的案例,还没想好哪些失败。。。")
        assert True
  • conftest.py
import pytest
import yaml

# 解决用例描述中的中文乱码问题
# 定义一个pytest的钩子函数,接收3个参数 session, config, items,返回值类型都为 None
# 主要用于在收集测试用例后,对其进行修改
def pytest_collection_modifyitems(session, config, items):
    # 循环遍历所有收集到的测试用例的 items
    for item in items:
        # 对每个 item的 name进行编码和解码
        # item.name.encode('utf-8')是将 item按照 UTF-8格式编码
        # decode("unicode-escape")是将编码后的字符串按照 unicode-escape格式解码,以便正确显示中文字符。
        item.name = item.name.encode("utf-8").decode("unicode-escape")
        # 对每个 item的 _nodeid进行编码和解码
        item._nodeid = item._nodeid.encode("utf-8").decode("unicode-escape")
  • pytest.ini
[pytest]

# 日志开关 true false
log_cli = true
# 日志级别
log_cli_level = info
# 使用4个并发进程运行测试
# 打印详细日志,相当于命令行加 -vs
# 在第3个失败的测试后停止执行
addopts = -n 4 --capture=no --maxfail=3
# 日志格式
log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
# 日志时间格式
log_cli_date_format = %Y-%m-%d %H:%M:%S
# 日志文件位置
log_file = ./log/test.log
# 日志文件等级
log_file_level = info
# 日志文件格式
log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
# 日志文件日期格式
log_file_date_format = %Y-%m-%d %H:%M:%

# 设置执行的路径
testpaths = tests
# 匹配测试文件的命名模式
python_files = test_*.py
# 匹配测试类的命名模式
python_classes = Test*
# 匹配测试函数的命名模式
python_functions = test_*
markers =
    run: specify order of test exection
  • log_util.py
import logging
import os

from logging.handlers import RotatingFileHandler

# 绑定绑定句柄到logger对象
logger = logging.getLogger(__name__)
# 获取当前工具文件所在的路径
root_path = os.path.dirname(os.path.abspath(__file__))
# 拼接当前要输出日志的路径
log_dir_path = os.sep.join([root_path, '..', f'/logs'])
if not os.path.isdir(log_dir_path):
    os.mkdir(log_dir_path)
# 创建日志记录器,指明日志保存路径,每个日志的大小,保存日志的上限
file_log_handler = RotatingFileHandler(os.sep.join([log_dir_path, 'log.log']), maxBytes=1024 * 1024, backupCount=10)
# 设置日志的格式
date_string = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(
    '[%(asctime)s] [%(levelname)s] [%(filename)s]/[line: %(lineno)d]/[%(funcName)s] %(message)s ', date_string)
# 日志输出到控制台的句柄
stream_handler = logging.StreamHandler()
# 将日志记录器指定日志的格式
file_log_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# 为全局的日志工具对象添加日志记录器
# 绑定绑定句柄到logger对象
logger.addHandler(stream_handler)
logger.addHandler(file_log_handler)
# 设置日志输出级别
logger.setLevel(level=logging.INFO)

3.2.6 Allure报告

  • 在线Allure报告



  • 静态Allure报告

在这里插入图片描述

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108571.html

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

相关文章

FLTRNN:基于大型语言模型的机器人复杂长时任务规划

目录 一、引言二、FLTRNN框架2.1 任务分解2.2 基于语言的递归神经网络&#xff08;Language-Based RNNs&#xff09;长期记忆&#xff08;Long-Term Memory, Ct&#xff09;&#xff1a;短期记忆&#xff08;Short-Term Memory, Ht&#xff09;&#xff1a; 2.3 增强推理能力的…

GAMES104:12 游戏引擎中的粒子和声效系统-学习笔记

文章目录 一&#xff0c;粒子基础Particle System二&#xff0c;粒子渲染三&#xff0c;GPU粒子及生命周期控制四&#xff0c;粒子应用五&#xff0c;声音基础5.1 Sound System5.2 Digital Sound5.3 Audio Rendering QA 一&#xff0c;粒子基础Particle System 网游里你的付费…

[数据结构]红黑树之插入操作(RBTree)

这里只着重介绍插入操作的实现&#xff1a;) 一、红黑树的概念和性质 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉搜索树。红黑树最初在1972年由Rudolf Bayer发明&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。随…

2024 年高教社杯全国大学生数学建模竞赛B题解题思路(第一版)

原文链接&#xff1a;https://www.cnblogs.com/qimoxuan/articles/18399372 赛题&#xff1a; 问题 1&#xff1a;抽样检测方案设计 分析&#xff1a; 抽样检测方案需要在保证决策准确性的同时&#xff0c;尽量减少检测成本。需要考虑抽样误差对决策的影响&#xff0c;以及如…

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用 文本识别是OCR&#xff08;Optical Character Recognition&#xff09;的一个子任务&#xff0c;其任务为&#xff1a;识别一个固定区域的的文本内容。 在OCR的两阶段方法里&#xff0c;文本识别模型接…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

linux搭建深度学习平台

linux搭建深度学习平台&#xff08;Ubuntu&#xff09; /home/guangyao/anaconda3 我服务器的anaconda地址 ~/anaconda3 1 首先就是打开浏览器&#xff0c;我实验室的是火狐&#xff0c;搜索anaconda下载&#xff0c;找到下载目录&#xff0c;cd进去&#xff0c; 2安装 bas…

【佳学基因检测】在bagisto中,grouped products(同组产品)和bundled products(打包产品)有什么不同?

【佳学基因检测】在bagisto中&#xff0c;grouped products&#xff08;同组产品&#xff09;和bundled products&#xff08;打包产品&#xff09;有什么不同&#xff1f; 在Bagisto电商平台中&#xff0c;**grouped products&#xff08;同组产品&#xff09;和bundled prod…

iceberg存储结构详解

iceberg底层组织方式 下图是Iceberg中表格式&#xff0c;s0、s1代表的是表Snapshot信息&#xff0c;每个表示当前操作的一个快照&#xff0c;每次commit都会生成一个快照Snapshot&#xff0c;每个Snapshot快照对应一个manifest list 元数据文件&#xff0c;每个manifest list …

2024国赛数学建模预测算法-BP神经网络模型的预测精度分析(MATLAB 实现)

人工神经网络 第一节 人工神经网络概述 在您阅读这本书的时候&#xff0c;大约有个相互连接的神经元在帮助您阅读、呼吸、思考&#xff0c;以及完成各种各样的动作。这些神经元中&#xff0c;有些有着与生俱来的功能&#xff0c;比如呼吸、吮吸&#xff0c;有些则是由后天训练…

动态规划DP--背包问题

文章目录 0-1背包问题 -- 问题定义动态规划解法代码题目&#xff1a;分割等和子集题解 0-1背包问题 – 问题定义 在 0-1 背包问题中&#xff0c;给定一个背包的最大容量 W&#xff0c;以及 n 个物品&#xff0c;每个物品有两个属性&#xff1a; 重量&#xff1a;第 i 个物品的…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…

广义回归神经网络(GRNN)

一、简介 广义回归神经网络 (General Regression Neural Network &#xff0c; GRNN) 的概念是由德 国科学家多纳德提出的&#xff0c;是径向基网络的其中一种 。因为其是以数理统计为基 础的&#xff0c;因此 GRNN 可以依据样本数据逼近其中包含的非线性映射关系。即使样本 数…

家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好

在快节奏的现代生活中&#xff0c;越来越多的人选择宠物作为心灵的慰藉与生活的伴侣。起初&#xff0c;这份陪伴的需求简单而纯粹&#xff0c;但随着日子一天天过去&#xff0c;那份简单的情感逐渐生根发芽&#xff0c;成长为深厚的责任与爱。我在前两年养了两只猫&#xff0c;…

一款云笔记支持在线协同文档,脑图,白板演示的工具,多个设备同步,让灵感与你同行(附源码)

前言 在快节奏的工作环境中&#xff0c;如何高-效地记录、整理并分享工作笔记已经成为了一项重要的技能。传统的笔记方式往往难以满足跨设备、即时同步以及团队协作的需求&#xff0c;导致信息孤岛和工作效率低下。面对这样的挑战&#xff0c;我们迫切需要一种全新的工具来改变…

【ArcGIS Pro原理第一期】各种空间插值原理:GPI、LPI、IDW等

ArcGIS Pro原理第一期&#xff1a;空间插值原理 空间插值方法概述1.1 全局多项式&#xff08;global polynomial interpolation, GPI&#xff09;方法原理使用范围 1.2 局部多项式&#xff08;local polynomial interpolation, LPI&#xff09;方法原理精度测量&#xff08;Mea…

echarts进度

echarts图表集 let numdata["I级",II级,III级,IV级,V级,劣V级] let pricedata40 option {backgroundColor: #0f375f,title: {show: false,text: ,left: center,top: 30%,textStyle: {color: #00D5FF,fontSize: 16,},},tooltip: {show: false},grid: {// show: true,…

鸿蒙界面开发——组件(5):菜单Menu 绑定菜单

菜单组件Menu Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 Menu 以垂直列表形式显示的菜单。包含MenuItem、MenuItemGroup子组件。 Menu()作为菜单的固定容器&#xff0c;无参数。 MenuItem(value?: MenuItemOptions| Cust…

DC-DC开关稳压电路

前面所讲的线性稳压电路具有结构简单、调节方便、输出电压稳定性强、纹波电压小等优点。但是&#xff0c;由于调整管始终工作在放大状态&#xff0c;自身功耗较大&#xff0c;故效率较低&#xff0c;甚至仅为30%~40%。而且&#xff0c;为了解决调整管散热问题&#xff0c;必须安…

Linux-(系统启动、用户管理)

目录 前言 关机&重启命令 基本介绍 注意细节 用户登录和注销 注意&#xff1a; 用户管理 基本介绍 添加用户 指定/修改密码 删除用户 查询用户信息 切换用户 查看当前用户登录用户 用户组 新增组 删除组 查看所有组 修改用户所属组 创建用户时指定用户…