2024年12月16日 星期一

Pytest - Command Line Arguments


在自動化測試中,根據不同的測試需求,我們經常需要在不同的環境下執行測試,pytest提供了一個彈性的機制:Command Line Arguments,讓我們可以通過命令行參數靈活地選擇測試環境。為了達成這個目的,我們需要使用以下兩個重要功能:
  • pytest_addoption函式:用於自定義命令行參數,讓我們可以在執行測試時動態傳遞參數。
  • pytestconfigrequest fixture:用於在測試中獲取這些命令行參數的值,再根據參數執行不同的邏輯。

如何實作

1. 使用pytest_addoption來定義命令行參數

首先,在conftest.py檔案中,我們使用pytest_addoption來定義自訂的命令行參數
#這是一個根據參數來選擇不同設定檔的範例,我們先定義設定檔名稱
QA_config = 'qa.prop'
prod_config = 'prod.prop'

def pytest_addoption(parser): #使用pytest_addoption自定義命令行選項
    parser.addoption(
    "--cmdopt", #命令行參數名稱
    action="store", #動作類型
    default='QA', #預設值為QA環境
    help="選擇測試環境: QA或Prod" #說明文字

    )
pytest_addoption中常用到的內建參數:
  • name:定義自訂命令行參數的名稱,以--開頭為命名規則。
  • action:指定當遇到該參數時要執行的動作,預設為"store"。
  • default:若命令行未輸入任何參數,則使用預設值。
  • help:提供參數的說明,當執行 pytest --help 時會顯示。

2. 使用pytestconfig取得命令行參數

接著,我們透過pytestconfig fixture來獲取命令行參數的值,並根據傳入的值來讀取對應的設定檔:
@pytest.fixture()
def CmdOpt(pytestconfig): #根據--cmdopt命令行參數選擇要讀取的設定檔
    opt = pytestconfig.getoption("cmdopt")  #獲取命令行參數值 
    if opt == 'Prod': #根據參數選擇對應的設定檔
        f = open(os.path.join(os.path.dirname(__file__), prod_config), 'r')
    else:
        f = open(os.path.join(os.path.dirname(__file__), QA_config), 'r')
    
    yield f  #傳回設定檔的內容給測試函式
    f.close()

3. 在測試函式中使用CmdOpt fixture

接下來,在測試中使用CmdOpt這個fixture,來讀取設定檔的內容
def test_argstest01(CmdOpt):
    print("Read config file:" + CmdOpt.readline())
#
讀取並印出設定檔第一行內容

執行測試

1. 預設執行QA環境測試

如果不傳遞任何參數,--cmdopt預設會是QA,執行時使用QA設定檔。

2. 指定執行Prod環境測試

若要切換到生產環境,則使用參數 --cmdopt=Prod

程式碼結構說明

  1. pytest_addoption:增加--cmdopt命令行選項,預設值為 "QA"。
  2. pytestconfig.getoption:取得命令行參數的值,根據參數值讀取不同的設定檔。
  3. Fixture cmdopt:讀取設定檔內容並傳遞給測試函式,確保測試結束後正確關閉檔案。
  4. test_argstest01測試函式:使用cmdopt fixture,輸出設定檔的第一行。

沒有留言:

張貼留言