zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【pytest】Hook 方法之 pytest_addoption :注册命令行参数

2023-09-27 14:29:15 时间

摘自:https://blog.csdn.net/waitan2018/article/details/104320927

Hook 方法之 pytest_addoption :

 

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

这个 Hook 方法一般和 内置 fixture pytestconfig 配合使用,pytest_addoption 注册命令行参数,pytestconfig 通过配置对象读取参数的值;

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

  1.  
    # conftest.py
  2.  
     
  3.  
    import pytest
  4.  
     
  5.  
    # 注册自定义参数 cmdopt 到配置对象
  6.  
    def pytest_addoption(parser):
  7.  
    parser.addoption("--cmdopt", action="store",
  8.  
    default="None",
  9.  
    help="将自定义命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  10.  
     
  11.  
    # 从配置对象获取 cmdopt 的值
  12.  
    @pytest.fixture(scope='session')
  13.  
    def cmdopt(pytestconfig):
  14.  
    return pytestconfig.getoption('--cmdopt')
  15.  
     
  16.  
    # 然后任何 fixture 或测试用例都可以调用 cmdopt 来获得设备信息

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() 返回的对象中的属性的名称;

挑几个比较常用的来演示:

1. name:这个不用多说,自定义的参数的名字;

2. action 、default 和 const、help :

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

  1.  
    # 注册自定义参数 cmdopt 到配置对象
  2.  
    def pytest_addoption(parser):
  3.  
    parser.addoption("--cmdopt", action="store",
  4.  
    default="这个是默认值...",
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    # 从配置对象中读取自定义参数的值
  8.  
    @pytest.fixture(scope="session")
  9.  
    def cmdopt(request):
  10.  
    return request.config.getoption("--cmdopt")
  11.  
     
  12.  
    # 将自定义参数的值打印出来
  13.  
    @pytest.fixture(autouse=True)
  14.  
    def fix_1(cmdopt):
  15.  
    print('\n --cmdopt的值:',cmdopt)
  16.  
     
  17.  
    if __name__ == '__main__':
  18.  
    # 使用参数
  19.  
    pytest.main(['-s', '--cmdopt=98k'])
  1.  
    # 控制台打印参数值:
  2.  
    ============================= test session starts =============================
  3.  
    test_Z.py::TestDemoA::test_A_001
  4.  
    --cmdopt的值: 98k
  5.  
    PASS
  6.  
    ============================== 1 passed in 0.02s ==============================

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

  1.  
    # 注册自定义参数 cmdopt 到配置对象
  2.  
    def pytest_addoption(parser):
  3.  
    parser.addoption("--cmdopt", action="append",
  4.  
    default=['这是默认参数'],
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    # 使用参数
  9.  
    pytest.main(['-s', '--cmdopt=98k', '--cmdopt=毛瑟小手枪'])
  1.  
    # 控制台打印参数值:
  2.  
    ============================= test session starts =============================
  3.  
    test_Z.py::TestDemoA::test_A_001
  4.  
    --cmdopt的值: ['这是默认参数', '98k', '毛瑟小手枪']
  5.  
    PASS
  6.  
    ============================== 1 passed in 0.02s ==============================

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

  1.  
    def pytest_addoption(parser):
  2.  
    parser.addoption("--cmdopt", action="store_const",
  3.  
    default='这是默认参数',
  4.  
    const='这个是为命令行参数指定的常量值...',
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    pytest.main(['-s','--cmdopt'])
  1.  
    # 控制台打印参数值:
  2.  
    ============================= test session starts =============================
  3.  
    test_Z.py::TestDemoA::test_A_001
  4.  
    --cmdopt的值: 这个是为命令行参数指定的常量值...
  5.  
    PASS
  6.  
    ============================== 1 passed in 0.02s ==============================

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

  1.  
    def pytest_addoption(parser):
  2.  
    parser.addoption("--cmdopt", action="append_const",
  3.  
    default=['这是默认参数'],
  4.  
    const='这个是为命令行参数指定的常量值...',
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    pytest.main(['-s','--cmdopt', '--cmdopt'])
  1.  
    # 控制台打印参数值:
  2.  
    ============================= test session starts =============================
  3.  
    test_Z.py::TestDemoA::test_A_001
  4.  
    --cmdopt的值: ['这是默认参数', '这个是为命令行参数指定的常量值...', '这个是为命令行参数指定的常量值...']
  5.  
    PASS
  6.  
    ============================== 1 passed in 0.02s ==============================

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

注意:在使用 type 指定类型时,也需要把 default 的类型修改为同样的类型!

  1.  
    def pytest_addoption(parser):
  2.  
    parser.addoption("--cmdopt", action="store",
  3.  
    default=100,
  4.  
    type=int,
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    pytest.main(['-s', f'--cmdopt=888'])
  1.  
    # 控制台打印参数值:
  2.  
    ============================= test session starts =============================
  3.  
    --cmdopt的值: 888
  4.  
    --cmdopt的类型: <class 'int'>
  5.  
    PASS
  6.  
    ============================== 1 passed in 0.02s ==============================

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

  1.  
    def pytest_addoption(parser):
  2.  
    parser.addoption("--cmdopt", action="store",
  3.  
    default='100',
  4.  
    choices= ['python', 'java', 'c++'],
  5.  
    help="将命令行参数 ’--cmdopt' 添加到 pytest 配置中")
  6.  
     
  7.  
    if __name__ == '__main__':
  8.  
    pytest.main(['-s', f'--cmdopt=888'])
  1.  
    # 控制台打印结果:
  2.  
     
  3.  
    ERROR: usage: conftest.py [options] [file_or_dir] [file_or_dir] [...]
  4.  
    conftest.py: error: argument --cmdopt: invalid choice: '888' (choose from 'python', 'java', 'c++')