🍅?點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快????
一、痛點分析
在實際企業的項目中,自動化測試的代碼往往需要在不同的環境中進行切換,比如多套測試環境、預上線環境、UAT環境、線上環境等等,并且在DevOps理念中,往往自動化都會與Jenkins進行CI/CD,不論是定時執行策略還是迭代測試,那么問題來了,難道每次切換環境都需要提供一套測試代碼?或者每次切換都要需修改我們的自動化環境配置?答案當然不是,不然怎么能叫測試自動化呢!
在未使用pytest的Hook相關方法之前,切換環境我們一般會使用python的內置模塊sys,它有一個argv的方法,可以從我們的命令行接收參數,通過它也可以實現上面的需求,就像如下部分代碼這樣:
try:if sys.argv[1] == '-p':# 預上線環境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=p_api_address)modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=p_api_address["request"]["url"])elif sys.argv[1] in [f't{i}' for i in range(1, 8)]:# 測試環境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=test_api_address(sys.argv[1][1:]))modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=test_api_address(sys.argv[1][1:])["request"]["url"])else:case_logger.error("Please confirm the environmental information.")print("Please confirm the environmental information.")raise Exception
except IndexError:# 生產環境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=formal_api_address)modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=formal_api_address["request"]["url"])
這種方式我們需要使用 "python xxx.py -p" 這種方式進行環境切換,然后再執行pytest命令行去執行測試用例,但是這種方法能在pytest的命令行中使用嗎?能不能將環境切換的命令行也集成到pytest的命令行中,執行整個自動化項目只使用一條命令行呢?
方法一:Hook方法pytest_addoption注冊命令行參數
1、Hook方法注解
pytest_addoption:可以讓用戶注冊一個自定義的命令行參數,方便用戶將數據傳遞給 pytest
這個 Hook 方法一般和內置 fixture pytestconfig 配合使用
pytest_addoption 注冊命令行參數,pytestconfig 通過配置對象讀取參數的值
參考文檔:Writing plugins — pytest documentation
2、使用方法
1.一般編寫到conftest.py文件中
2.定義pytest_addoption方法注冊pytest命令行參數,函數名和參數保持一致
def pytest_addoption(parser):"""注冊自定義參數 env 到配置對象"""parser.addoption("--env", action="store",default="https://www.cnblogs.com/",help="將命令行參數 ’--env' 添加到 pytest 配置中")
parser.addoption參數說明:
- name:自定義命令行參數的名字,可以是:"xx", "-xx" 或 "--xx"
- action:在命令行中遇到此參數時要采取的基本操作類型
- store:默認,只存儲參數的值,可以存儲任何類型的值,此時 default 也可以是任何類型的值,而且命令行參數多次使用也只能生效一個,最后一個值覆蓋之前的值
- append:存儲一個列表,用 append 模式將可以同時多次使用自定義參數,并且 default ?默認值必須是一個列表,pytest 會把 default ?默認參數的值和多個自定義參數的值放在一個列表中
- store_const:用 const 為命令行參數指定一個常量值,必須和 const 參數同時使用,使用這個模式后命令行參數不能賦值
- append_const:存儲一個列表,使用 const 為命令行參數指定一個常量值,并將 default 默認值和 const ?常量值添加到列表中,這個模式可以同時多次使用自定義參數,但是還是不能賦值,只能使用常量
- nargs:應該使用的命令行參數的數量
- const:某些操作和nargs選擇所需的常量值
- default:如果參數的值不在命令行中,則使用默認值
- type:可以是 python 的基礎類型,比如:int,str,float,list 等類型,如果不指定類型的話,pytest會把接受到的參數值都默認為 str 類型,所以我們有時需要指定參數的類型,在使用 type 指定類型時,也需要把 default 的類型修改為同樣的類型!
- choices:choices 可以指定幾個值,自定義參數必須在這幾個值中選擇一個,否則會報錯
- required:命令行選項是否可以省略(僅可選)
- help:對參數作用的簡要說明
- metavar:用法消息中參數的名稱
- dest:要添加到 parse_args() 返回的對象中的屬性的名稱
3.使用request.config.getoption("--命令行")獲取命令行參數的值
@pytest.fixture(scope="session")
def get_env(request):"""從配置對象中讀取自定義參數的值"""return request.config.getoption("--env")
4.fixture繼承,進行環境切換
@pytest.fixture(autouse=True)
def set_env(get_env):"""將自定義參數的值寫入全局配置文件"""with open(ENV_TXT_FILE, 'w', encoding='utf-8') as f:f.write(get_env)
5.通過pytest命令行傳參一鍵化實現環境切換和測試用例執行
方法二:使用插件pytest-base-url進行命令行傳參
1.安裝pytest-base-url
pip install pytest-base-url -i https://pypi.douban.com/simple
2.將base_url參數傳入到fixture函數中
@pytest.fixture
def driver_setup(base_url):try:URL = base_urlstart_chrome(URL, options=browser_options(), headless=False)driver = get_driver()except Exception as e:log.error(e)else:yield driver
3.pytest命令行傳參
使用 --base-url https://www.xxx.com/ 形式傳參
pytest --base-url https://www.cnblogs.com/
第一種不局限于環境切換,任何想通過pytest命令行傳入自定義的參數都可以通過方法一實現,因此殺雞焉用牛刀,環境切換優先推薦方法二!
二、總結
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。