【pytest】Hook 方法之 pytest_addoption :注冊命令行參數


摘自: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++')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM