IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> pytest中pytest_addoption用法 动态添加命令行参数 (钩子函数) -> 正文阅读

[开发测试]pytest中pytest_addoption用法 动态添加命令行参数 (钩子函数)

考虑场景:

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

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

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

# file_name: conftest.py


import pytest


def pytest_addoption(parser):
	# 注册自定义参数cmdopt到配置对象
    parser.addoption(
        "--cmdopt", action="store", default="type1", help="my option: type1 or type2"
    )
    # 注册自定义参数env到配置对象
    parser.addoption(
        "--env", action="store", default="dev", help="env:表示测试环境,默认dev环境"
    )


@pytest.fixture()
def cmdopt(pytestconfig):
	# 从配置对象获取cmdopt的值
    return pytestconfig.getoption("cmdopt")


@pytest.fixture()
def env(request):
	# 从配置对象获取env的值
    return request.config.getoption("--env")

上面conftest.py文件中新增了两个命令行参数:–cmdopt和–env;然后定义了两个fixture,在测试用例中想要获得参数–cmdopt的值,就可以调用cmdopt函数;调用env函数可以获取参数–env的值。
编写测试用例:

# file_name: test_option.py

import pytest


def test_option(env):
    if env == 'dev':
        print("当前测试环境为:{},域名切换为开发环境".format(env))
    elif env == 'test':
        print("当前测试环境为:{},域名切换为测试环境".format(env))
    else:
        print("环境错误,当前环境{}不存在".format(env))


if __name__ == '__main__':
    pytest.main(['-s', 'test_option.py'])

上面例子是获取env的值,针对env值的不同做不同的操作。
不带参数运行:
命令行中输入指令:pytest test_option.py -s,运行结果:

(venv) PS D:\work_project\pytest_project> pytest -s
========================================================================== test session starts ===========================================================================
platform win32 -- Python 3.8.10, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\work_project\pytest_project
collected 1 item

tests\test_file.py 当前测试环境为:dev,域名切换为开发环境
.

=========================================================================== 1 passed in 0.02s ============================================================================

因为我们在conftest.py文件中定义的参数env的默认值为dev,所以当运行时命令行不传env参数,则使用默认值dev。
带参数运行:
命令行中输入指令:pytest test_option.py -s --env=test,运行结果:

(venv) PS D:\work_project\pytest_project> pytest -s --env=test
============================================================================ test session starts =============================================================================
platform win32 -- Python 3.8.10, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\work_project\pytest_project
collected 1 item                                                                                                                                                              

tests\test_file.py 当前测试环境为:test,域名切换为测试环境
.

============================================================================= 1 passed in 0.02s ==============================================================================

从结果中可以看到,命令行中输入参数env=test,在测试用例中获取到通过fixture获取到env的值为test。

思考:从结果上来看

pytestconfig.getoption() 和 request.config.getoption()达到的效果是一样的,详细分析, 下面是pytest源码展示:

@fixture(scope="session")
def pytestconfig(request: FixtureRequest) -> Config:
    """Session-scoped fixture that returns the :class:`_pytest.config.Config` object.

    Example::

        def test_foo(pytestconfig):
            if pytestconfig.getoption("verbose") > 0:
                ...

    """
    return request.config

parser.addoption() 参数说明:

1.name:自定义命令行参数的名字,可以是:“foo”, “-foo” 或 “–foo”;
2.action:在命令行中遇到此参数时要采取的基本操作类型;
3.nargs:应该使用的命令行参数的数量;
4.const:某些操作和nargs选择所需的常量值;
5.default:如果参数不在命令行中,则生成的默认值。
6.type:命令行参数应该转换为的类型;
7.choices:参数允许值的容器;
8.required:命令行选项是否可以省略(仅可选);
9.help:对参数作用的简要说明;
10.metavar:用法消息中参数的名称;
11.dest:要添加到 parse_args() 返回的对象中的属性的名称;

挑几个比较常用的来演示 action 、default 和 const、help :

action=“store”:默认,只存储参数的值,可以存储任何类型的值,此时 default 也可以是任何类型的值,而且命令行参数多次使用也只能生效一个,最后一个值覆盖之前的值

action=“append”:存储一个列表,用 append 模式 将可以同时多次使用自定义参数,并且 default 默认值必须是一个列表,pytest 会把 default 默认参数的值和多个自定义参数的值放在一个列表中

action=“store_const”:使用 const 为命令行参数指定一个常量值,必须和 const 参数同时使用,使用这个模式后命令行参数不能赋值

action=“append_const”:存储一个列表,使用 const 为命令行参数指定一个常量值,并将 default 默认值和 const 常量值添加到列表中,这个模式可以同时多次使用自定义参数,但是还是不能赋值,只能使用常量

type:type 的类型可以是 python 的基础类型,比如:int,str,float,list 等类型,如果不指定类型的话,pytest会把接受到的参数值都默认为 str 类型,所以我们有时需要指定参数的类型:
注意:在使用 type 指定类型时,也需要把 default 的类型修改为同样的类型!

choices:choices 可以指定几个值,自定义参数必须在这几个值中选择一个,否则会报错:

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:30:21  更:2021-09-18 10:31:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 23:06:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码