Pytest教程__Hook函数pytest_addoption(parser):定义自己的命令行参数(14-1)

文章介绍了如何在pytest框架下,通过conftest.py文件定义钩子函数pytest_addoption来自定义命令行参数,如`--env_opt`和`--run_level`,并使用fixture获取这些参数值,以实现不同测试环境的切换和不同业务逻辑的执行。在测试用例中通过调用fixture函数获取参数,实现动态配置和控制测试流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑场景:

  1. 我们的自动化用例需要支持在不同测试环境运行,有时候在dev环境运行,有时候在test环境运行;
  2. 有时候需要根据某个参数不同的参数值,执行不同的业务逻辑;

上面的场景我们都可以通过“在命令行中输入参数,然后用例中接收这个参数,通过判断这个参数的值来做不同的逻辑”来实现。那么我们的需求就变为pytest中如何自定义一个命令行参数呢?这时候我们就需要用到pytest的钩子函数:pytest_addoption

在conftest.py文件中定义命令名

新建一个conftest.py文件

然后在conftest.py文件中通过pytest_addoption方法来添加命令行参数,通过定义的fixture来获得参数的值。

import pytest


# pytest_addoption(parser) 定义自己的命令行参数的固定写法
def pytest_addoption(parser):
    # 定义 --env_opt 参数名
    parser.addoption("--env_opt")

    # 定义 --run_level 参数名
    # 参数说明:
    #   default:当命令行不调用参数时的默认值
    #   help:在帮助中显示的说明
    parser.addoption("--run_level", default=1, help="执行用例的级别", action="store")


# 获取--env_opt参数值
@pytest.fixture(scope="session")
def env_opt(request):
    return request.config.getoption("--env_opt")


# 获取--run_level参数值
@pytest.fixture(scope="session")
def run_level(request):
    return request.config.getoption("run_level")


@pytest.fixture(scope="session", autouse=True)
def start_appium_desired(env_opt, run_level):
    print(f"\n{env_opt}")
    print(f"\n{run_level}")

上面conftest.py中新增了两个命令行参数:--env_opt 和 --run_level,然后定义了两个fixture,在测试用例中想要获得参数 --env_opt 和 --run_level 的值,就可以调用 env_opt 或 run_level 函数获取对应的值。

在用例中获取定义命令的值

class TestDemo:

    def test_001(self, env_opt):
        print(f"\nenv_opt参数值:{env_opt}")

    def test_002(self, run_level):
        print(f"\nrun_level参数值:{run_level}")

调用定义的命令

import pytest
import os

if __name__ == '__main__':
    env = {
        "host": "127.0.0.1",
        "port": "6789"
        }

    pytest.main(["-vs", "--alluredir=./temp", f"--env_opt={env}"])
    os.system("allure generate ./temp -o ./report/ --clean")

执行结果

-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以留言【777】直接拿走就好了

 

### 使用 Pytest 和 XLSX 相关 Hook 或插件 Pytest 提供了一个灵活的框架来支持各种类型的测试数据源,包括来自 Excel 文件的数据。通过特定的钩子函数 (hooks),可以实现从 `.xlsx` 文件读取测试用例并执行。 #### 安装必要的依赖库 为了处理 Excel 文件,在项目环境中需安装 `openpyxl` 库以及 pytest 的扩展包 `pytest-excel`: ```bash pip install openpyxl pytest-excel ``` #### 配置 Pytest 来识别 XLSX 测试文件 为了让 Pytest 能够解析和加载 `.xlsx` 文件作为测试输入,通常会创建自定义命令行选项或利用现有的 hooks 函数。例如,可以通过重写 `pytest_addoption()` 方法向命令行参数添加新的开关,并使用 `pytest_generate_tests(metafunc)` 来动态生成基于工作表内容的多个测试实例[^1]。 下面是一个简单的例子展示如何编写一个小型插件来集成此功能: ```python import xlrd import pytest def load_excel_data(file_path, sheet_name='Sheet1'): """辅助函数用于打开Excel文档并返回指定sheet内的所有记录""" workbook = xlrd.open_workbook(file_path) worksheet = workbook.sheet_by_name(sheet_name) data = [] headers = [] for row_index in range(worksheet.nrows): if not headers: headers = [ cell.value.lower().replace(' ', '_') for cell in worksheet.row(row_index)] else: entry = dict(zip(headers, [cell.value for cell in worksheet.row(row_index)])) data.append(entry) return data @pytest.hookimpl(tryfirst=True) def pytest_load_initial_conftests(args, early_config, parser): # 可选:在此处注册额外的命令行参数 pass def pytest_generate_tests(metafunc): """ 动态地为标记有 @pytest.mark.excel 参数化的测试方法提供参数集。 :param metafunc: Metafunc 对象包含了当前正在被收集的信息 """ marker = getattr(metafunc.function, "excel", None) if isinstance(marker, tuple) and len(marker.args) >= 2: file_path, sheet_name = marker.args[:2] try: test_cases = load_excel_data(file_path, sheet_name=sheet_name) argnames = list(test_cases[0].keys()) argvalues = [[case[argname] for argname in argnames] for case in test_cases] metafunc.parametrize(argnames=argnames, argvalues=argvalues) except Exception as e: raise ValueError(f"Failed to read excel {file_path}: {e}") ``` 上述代码片段展示了怎样构建一个基本的 Pytest 插件以导入 Excel 数据并将其转换成可迭代的对象列表传递给测试案例。注意这里假设每列代表不同的参数名称而每一行则对应单个测试场景下的具体数值组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值