pytest框架学习-pytest_addoption钩子函数
适用场景:一套自动化代码,多套环境。
pytest_addoption 允许用户自定义注册一个命令行参数,方便用户通过命令行参数的形式给 pytest 传递不同的参数进行不同测试场景的切换。
pytest_addoption 钩子函数一般和内置 fixture pytestconfig 配合使用, pytest_addoption 注册自定义的命令行参数, pytestconfig 通过pytest配置对象读取参数的值。
pytest_addoption 钩子函数还可以与内置fixture函数request中 request.config.getoption 结合使用来读取用户注册的自定义命令行参数对应的参数值。
opts:是要注册的命令行参数
可以看到,其他参数和add_argument()是一样的
咱们可以看官网解释:argparse --- 命令行选项、参数和子命令解析器 — Python 3.12.1 文档
注意:使用def pytest_addoption(parser) 需要放在conftest.py文件中
conftest.py中代码如下:
import pytest def pytest_addoption(parser): """ 自定义命令行参数的名字,可以是:"foo", "-foo" 或 "--foo"; action:指明应当如何处理一个参数 'store', 'store_const', 'store_true', 'append', 'append_const', 'count', 'help', 'version' nargs:参数可被使用的次数 const:存储一个常量值 default:默认为 None type:自动将参数转换为给定的类型 int, float, argparse.FileType('w') 或可调用函数 choices:将值限制为指定的可选项集合 required:指明某个参数是必需的还是可选的 True 或 False help:参数的帮助消息 metavar:要在帮助中显示的参数替代显示名称 dest:指定要在结果命名空间中使用的属性名称 """ parser.addoption( "--env", # 添加命令行参数--env,用来表示运行环境 action="store", default="dev", # 默认为dev开发环境 choices=["test", "dev", "auto"], # name只能在这三个环境中选取,否则报错 help="选择运行环境") @pytest.fixture(scope='session') def get_env(request): """ 获取命令行参数--env的值,即获取运行环境 """ name = request.config.getoption("--env") return name
然后在测试用例文件中,可以作为参数引用
class TestRunForAddoption: def test_normal_addoption(self, get_env):print(f"当前代码运行环境是:{get_env}")
pytest -sv -k 'test_normal_addoption'
此时没有传入命令行参数--env,可以看到,取得是默认值dev
pytest -sv -k 'test_normal_addoption' --env test
传入--env参数,并且赋值为test,可以看到,运行结果取值test
pytest -sv -k 'test_normal_addoption' --env uat
传入--env参数,赋值为uat,不在choices列表里,报错