ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pytest框架-参数化parametrizing、命令行传参

2021-07-26 18:33:48  阅读:703  来源: 互联网

标签:传参 __ -- parametrizing cmdopt pytest 参数 命令行


目录

1、parametrizing

1)pytest.mark.parametrize装饰器实现测试用例参数化。

2)标记单个实例参数化

2、参数组合

3、pytest_addoption注册命令行传参

1)conftest配置参数

2)pytest_addoption 注册、pytestconfig 获取命令行参数 

 3)parser.addoption() 参数说明

name

action、default、const、help

type

choices


1、parametrizing

1)pytest.mark.parametrize装饰器实现测试用例参数化

例子:实现检查一定的输入和期望输出测试功能

新建test_1.py文件:

#coding:utf-8
#实现检查一定的输入和期望输出测试功能

import pytest
@pytest.mark.parametrize("a,b",
                         [("1+2", 3),
                          ("5-3", 2),
                          ("6*6", 30),
                          ("81/9",8)
                          ])
def test_eval(a, b):
    assert eval(a) == b

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

运行结果:

 函数的参数,在运行结果中可以看到输入和输出值

2)标记单个实例参数化

使用内置的mark.xfail

新建test_2.py文件:

#coding:utf-8
#实现检查一定的输入和期望输出测试功能

import pytest
@pytest.mark.parametrize("a,b",
                         [("1+2", 3),
                          pytest.param("5-3", 4,marks=pytest.mark.xfail),
                          ("6*6", 36),
                          pytest.param("81/9",8,marks=pytest.mark.xfail),
                          ])
def test_eval(a, b):
    print("--------开始执行用例ooo-------")
    assert eval(a) == b

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

运行结果:

x表示标记为失败的用例,预期结果是失败,实际运行也是失败,显示xfailed

.表示成功的用例,预期结果是成功,实际运行也是成功

2、参数组合

若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

新建test_3.py文件:

两个参数a,b

#若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

import pytest
@pytest.mark.parametrize("a",[0,1])
@pytest.mark.parametrize("b",[3,4])
def test_01(a,b):
    print("测试数据组合:a->%s,b->%s"%(a,b))

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

运行结果:

 三个参数a,b,c

#若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

import pytest
@pytest.mark.parametrize("a",[0,1])
@pytest.mark.parametrize("b",[3,4])
@pytest.mark.parametrize("c",[2,6])
def test_01(a,b,c):
    print("测试数据组合:a->%s,b->%s,c->%s"%(a,b,c))

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

运行结果:

3、pytest_addoption注册命令行传参

命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行"pytest --html=report.html",这里面的”--html=report.html“就是从命令行传入的参数对应的参数名称是html,参数值是report.html。

1)conftest配置参数

首先需要在conftest.py添加命令行选项,命令行传入参数”--cmdopt“, 用例如果需要用到从命令行传入的参数,就调用cmdopt函数。

pytest_addoption 可以让用户注册一个自定义的命令行参数,方便用户将数据传递给 pytest;

新建conftest.py文件:

#首先需要在conftest.py添加命令行选项,命令行传入参数”--cmdopt“, 用例如果需要用到从命令行传入的参数,就调用cmdopt函数

import pytest
#注册自定义参数 cmdopt 到配置对象
def addoption(parser):
    parser.addoption(
        "--cmdopt", action="store", default="type1", help="my option: type1 or type2"
    )
#从配置对象获取 cmdopt 值
@pytest.fixture
def cmdopt(request):
    return request.config.getoption("--cmdopt")

新建test_1.py文件:

import pytest
def test_answer(cmdopt):
    if cmdopt == "type1":
        print("oneoneone")
    elif cmdopt == "type2":
        print("twotwotwo")
    assert 0

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

 直接右键执行运行结果:

 cmd环境中,输入命令:pytest -s test_1.py 进行执行,运行结果:

直接运行pytest -s test_1.py,不带参数执行,默认传参数default="type1";

使用命令行带上参数执行:pytest -s test_1.py --cmdopt=type2,运行结果:

命令行传参数有两种写法,还有一种分成2个参数也可以的,参数和名称用空格隔开,执行:pytest -s test_case1.py --cmdopt type2

2)pytest_addoption 注册、pytestconfig 获取命令行参数 

新建conftest.py文件:

import pytest
 
# 注册自定义参数 cmdopt 到配置对象
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store",
                     default="None",
                     help="将自定义命令行参数 ’--cmdopt' 添加到 pytest 配置中")
 
# 从配置对象获取 cmdopt 的值,任何 fixture 或测试用例都可以调用 cmdopt 来获得设备信息
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):
    return pytestconfig.getoption('--cmdopt')

 3)parser.addoption() 参数说明

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

name

自定义命令行参数的名字

action、default、const、help

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

新建test_2.py文件:

import pytest
#action="store"
# 注册自定义参数 cmdopt 到配置对象
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store",
                     default="这个是默认值...",
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

# 从配置对象中读取自定义参数的值
@pytest.fixture(scope="session")
def cmdopt(request):
    return request.config.getoption("--cmdopt")

# 将自定义参数的值打印出来
@pytest.fixture(autouse=True)
def fix_1(cmdopt):
    print('\n --cmdopt的值:', cmdopt)

if __name__ == '__main__':
    # 使用参数
    pytest.main(['-s', '--cmdopt=onetwo'])

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

新建test_3.py文件:

import pytest
#action="append"
# 注册自定义参数 cmdopt 到配置对象
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="append",
                     default=['这是默认参数'],
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

if __name__ == '__main__':
    # 使用参数
    pytest.main(['-s', '--cmdopt=onetwo', '--cmdopt=balala小魔仙'])

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

新建test_4.py文件:

import pytest
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store_const",
                     default='这是默认参数',
                     const='这个是为命令行参数指定的常量值...',
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

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

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

新建test_5.py文件:

import pytest
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="append_const",
                     default=['这是默认参数'],
                     const='这个是为命令行参数指定的常量值...',
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

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

type

type 的类型可以是 python 的基础类型,比如:int,str,float,list 等类型,如果不指定类型的话,pytest会把接受到的参数值都默认为 str 类型,所以我们有时需要指定参数的类型;

新建test_6.py文件:

import pytest
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store",
                     default=100,
                     type=int,
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

if __name__ == '__main__':
    pytest.main(['-s', f'--cmdopt=888'])

choices

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

新建test_7.py文件:

import pytest
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store",
                     default='100',
                     choices=['python', 'java', 'c++'],
                     help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")

if __name__ == '__main__':
    pytest.main(['-s', f'--cmdopt=888'])

标签:传参,__,--,parametrizing,cmdopt,pytest,参数,命令行
来源: https://blog.csdn.net/weixin_46731640/article/details/119113380

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有