考慮場景:
- 我們的自動化用例需要支持在不同測試環境運行,有時候在dev環境運行,有時候在test環境運行;
- 有時候需要根據某個參數不同的參數值,執行不同的業務邏輯;
上面的場景我們都可以通過“在命令行中輸入參數,然后用例中接收這個參數,通過判斷這個參數的值來做不同的邏輯”來實現。那么我們的需求就變為pytest中如何自定義一個命令行參數呢?這時候我們就需要用到pytest的鈎子函數:pytest_addoption
在conftest.py文件中定義命令名
新建一個conftest.py文件
然后在conftest.py文件中通過pytest_addoption方法來添加命令行參數,通過定義的fixture來獲得參數的值。
import pytest # pytest_addoption(parser) 定義自己的命令行參數的固定寫法 def pytest_addoption(parser): # 定義 --env_opt 參數名 parser.addoption("--env_opt") # 定義 --run_level 參數名 # 參數說明: # default:當命令行不調用參數時的默認值 # help:在幫助中顯示的說明 parser.addoption("--run_level", default=1, help="執行用例的級別", action="store") # 獲取--env_opt參數值 @pytest.fixture(scope="session") def env_opt(request): return request.config.getoption("--env_opt") # 獲取--run_level參數值 @pytest.fixture(scope="session") def run_level(request): return request.config.getoption("run_level") @pytest.fixture(scope="session", autouse=True) def start_appium_desired(env_opt, run_level): print(f"\n{env_opt}") print(f"\n{run_level}")
上面conftest.py中新增了兩個命令行參數:--env_opt 和 --run_level,然后定義了兩個fixture,在測試用例中想要獲得參數 --env_opt 和 --run_level 的值,就可以調用 env_opt 或 run_level 函數獲取對應的值。
在用例中獲取定義命令的值
class TestDemo: def test_001(self, env_opt): print(f"\nenv_opt參數值:{env_opt}") def test_002(self, run_level): print(f"\nrun_level參數值:{run_level}")
調用定義的命令
import pytest import os if __name__ == '__main__': env = { "host": "127.0.0.1", "port": "6789" } pytest.main(["-vs", "--alluredir=./temp", f"--env_opt={env}"]) os.system("allure generate ./temp -o ./report/ --clean")
執行結果