1. 程式人生 > 其它 >pytest 註冊命令列引數

pytest 註冊命令列引數

Hook 方法之 pytest_addoption :


pytest_addoption 可以讓使用者註冊一個自定義的命令列引數,方便使用者將資料傳遞給 pytest;

這個 Hook 方法一般和 內建 fixture pytestconfig 配合使用,pytest_addoption 註冊命令列引數,pytestconfig 通過配置物件讀取引數的值;

pytest_addoption 註冊、pytestconfig 獲取命令列引數 :

# conftest.py

import pytest

# 註冊自定義引數 cmdopt 到配置物件
def pytest_addoption(parser):
parser.addoption(
"--cmdopt", action="store", default="None", help="將自定義命令列引數 ’--cmdopt' 新增到 pytest 配置中") # 從配置物件獲取 cmdopt 的值 @pytest.fixture(scope='session') def cmdopt(pytestconfig): return pytestconfig.getoption('--cmdopt') # 然後任何 fixture 或測試用例都可以呼叫 cmdopt 來獲得裝置資訊

 

parser.addoption() 引數說明:

name:自定義命令列引數的名字,可以是:"
foo""-foo""--foo"; action:在命令列中遇到此引數時要採取的基本操作型別; nargs:應該使用的命令列引數的數量; const:某些操作和nargs選擇所需的常量值; default:如果引數不在命令列中,則生成的預設值。 type:命令列引數應該轉換為的型別; choices:引數允許值的容器; required:命令列選項是否可以省略(僅可選); help:對引數作用的簡要說明; metavar:用法訊息中引數的名稱; dest:要新增到 parse_args() 返回的物件中的屬性的名稱;

 

挑幾個比較常用的來演示:


1. name:這個不用多說,自定義的引數的名字;

2. action 、default 和 const、help :

action="store":預設,只儲存引數的值,可以儲存任何型別的值,此時 default 也可以是任何型別的值,而且命令列引數多次使用也只能生效一個,最後一個值覆蓋之前的值;

# 註冊自定義引數 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=98k'])

 

# 控制檯列印引數值:
============================= test session starts =============================
test_Z.py::TestDemoA::test_A_001
--cmdopt的值: 98k
PASS
============================== 1 passed in 0.02s ==============================

 

action="append":儲存一個列表,用 append 模式 將可以同時多次使用自定義引數,並且 default 預設值必須是一個列表,pytest 會把 default 預設引數的值和多個自定義引數的值放在一個列表中:

# 註冊自定義引數 cmdopt 到配置物件
def pytest_addoption(parser):
parser.addoption("--cmdopt", action="append",
default=['這是預設引數'],
help="將命令列引數 ’--cmdopt' 新增到 pytest 配置中")

if __name__ == '__main__':
# 使用引數
pytest.main(['-s', '--cmdopt=98k', '--cmdopt=毛瑟小手槍'])
# 控制檯列印引數值:
============================= test session starts =============================
test_Z.py::TestDemoA::test_A_001
--cmdopt的值: ['這是預設引數', '98k', '毛瑟小手槍']
PASS
============================== 1 passed in 0.02s ==============================

 

action="store_const":使用 const 為命令列引數指定一個常量值,必須和 const 引數同時使用,使用這個模式後命令行引數不能賦值:

def pytest_addoption(parser):
parser.addoption("--cmdopt", action="store_const",
default='這是預設引數',
const='這個是為命令列引數指定的常量值...',
help="將命令列引數 ’--cmdopt' 新增到 pytest 配置中")

if __name__ == '__main__':
pytest.main(['-s','--cmdopt'])
# 控制檯列印引數值:
============================= test session starts =============================
test_Z.py::TestDemoA::test_A_001
--cmdopt的值: 這個是為命令列引數指定的常量值...
PASS
============================== 1 passed in 0.02s ==============================

 

action="append_const":儲存一個列表,使用 const 為命令列引數指定一個常量值,並將 default 預設值和 const 常量值新增到列表中,這個模式可以同時多次使用自定義引數,但是還是不能賦值,只能使用常量;

def pytest_addoption(parser):
parser.addoption("--cmdopt", action="append_const",
default=['這是預設引數'],
const='這個是為命令列引數指定的常量值...',
help="將命令列引數 ’--cmdopt' 新增到 pytest 配置中")

if __name__ == '__main__':
pytest.main(['-s','--cmdopt', '--cmdopt'])
# 控制檯列印引數值:
============================= test session starts =============================
test_Z.py::TestDemoA::test_A_001
--cmdopt的值: ['這是預設引數', '這個是為命令列引數指定的常量值...', '這個是為命令列引數指定的常量值...']
PASS
============================== 1 passed in 0.02s ==============================

 

3. type:type 的型別可以是 python 的基礎型別,比如:int,str,float,list 等型別,如果不指定型別的話,pytest會把接受到的引數值都預設為 str 型別,所以我們有時需要指定引數的型別:

注意:在使用 type 指定型別時,也需要把 default 的型別修改為同樣的型別!

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'])

 

# 控制檯列印引數值:
============================= test session starts =============================
--cmdopt的值: 888
--cmdopt的型別: <class 'int'>
PASS
============================== 1 passed in 0.02s ==============================


4. choices:choices 可以指定幾個值,自定義引數必須在這幾個值中選擇一個,否則會報錯:

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'])
# 控制檯列印結果:

ERROR: usage: conftest.py [options] [file_or_dir] [file_or_dir] [...]
conftest.py: error: argument --cmdopt: invalid choice: '888' (choose from 'python', 'java', 'c++')

 

原文連結:https://blog.csdn.net/waitan2018/article/details/104320927