Pytest多環(huán)境切換的常見方法介紹
你是否也遇到過這種情況:本地測試通過,一到測試環(huán)境就翻車?環(huán)境變量錯亂、接口地址混亂、數(shù)據(jù)源配置丟失……這些「環(huán)境切換」問題簡直像定時炸彈,隨時引爆你的測試流程!
測試人員每天都跟不同的環(huán)境打交道,比如線上環(huán)境,測試環(huán)境,預上線環(huán)境等等,那么作為自動化測試人員寫的代碼,我們也要具備能自由切換環(huán)境的能力,那么今天小編就給大家聊一下,如何能讓我們python語言寫的測試用例可以自由切換到不同的環(huán)境下面去運行呢?
Pytest 作為自動化測試的主力框架,如何實現(xiàn)本地、測試、預發(fā)、生產環(huán)境的靈活切換?有沒有一種通用、實用、可復用的方案?
“Pytest如何實現(xiàn)環(huán)境切換,讓測試適應不同場景?”這個問題曾讓我撓頭。配置文件怎么寫?參數(shù)怎么傳?能不能自動化切換而不用手動改代碼?帶著這些疑問,我開始摸索Pytest的環(huán)境管理功能。從簡單的命令行參數(shù)到復雜的配置文件,我發(fā)現(xiàn)它不僅靈活,還能無縫對接團隊協(xié)作。那么,具體該怎么操作呢?接下來,讓我們一起進入實戰(zhàn),揭開Pytest環(huán)境切換的奧秘。
今天給他大家聊一下通過pytest框架實現(xiàn)自由環(huán)境切換的幾種方法。
1.pytest-base-url
pytest有一個插件叫pytest-base-url ,是管理base_url非常好的一款插件,文檔資料鏈接:https://pypi.org/project/pytest-base-url/
下載方式:
pip install pytest-base-url

案例如下:
import requests
def test_demo(base_url):
resp = requests.get(base_url)
status_code = resp.status_code
assert status_code == 200第1種使用方式是終端添加--base-url這個命令,如下所示:

第2種使用方式是在pytest.ini配置文件種去配置base_url,然后自動讀取url的數(shù)據(jù),這樣就不用添加--base-url這個命令行參數(shù)了:

命令行直接運行pytest 即可。
2.hooks函數(shù)
pytest有個hooks函數(shù),可以自定義命令行參數(shù),一般在conftest.py中去引用。
Conftest.py中寫pytest_addoption這個hooks函數(shù),可以自定義命令行參數(shù),base_url只能對一個url地址進行傳遞,那么有的項目不僅需要多項目請求的url地址進行不同環(huán)境的切換,還需要對mysql的url地址進行不同的切換,這個時候就可以用自定義命令,定義不同的命令行參數(shù),這樣我們在執(zhí)行pytest的時候就可以自由進行傳遞。
代碼如下:
通過pytest_addoption這個hooks函數(shù),設置了兩個命令行參數(shù),一個是--mysql-url,另一個是--project-url,help后面是對這兩個命令行的解釋,解釋說明這兩個命令行代表什么含義
import pytest
def pytest_addoption(parser):
parser.addoption(
"--mysql-url", action="store", help="這里可以傳遞mysql的url地址"
)
parser.addoption(
"--project-url", action="store", help="這里可以傳遞項目的url地址"
)通過fixture函數(shù)中的request參數(shù)去讀取命令行中傳遞的參數(shù),賦值給一個變量,就可以在pytest中隨便使用。
@pytest.fixture(scope='class')
def get_url(request):
mysql_url = request.config.getoption('--mysql-url')
project_url = request.config.getoption('--project-url')
return mysql_url, project_url項目代碼如下:
fixture函數(shù)的調用,直接把fixture的名字當成參數(shù)傳遞到測試用例里面即可
import requests
def test_demo(get_url):
mysql_url = get_url[0]
print('mysql_url的地址是{}'.format(mysql_url))
project_url = get_url[1]
resp = requests.get(project_url)
status_code = resp.status_code
assert status_code == 200運行測試的命令為:
pytest -s --mysql -url 192.168.1.11--project-url http://www.example.com
如下圖所示:

3.yml和fixture
通過 yml文件 和 fixture 進行配合使用,首先在項目目錄下面創(chuàng)建一個conf.yml,然后里面去手動配置現(xiàn)在要運行的環(huán)境,截圖如下:

然后在創(chuàng)建一個conftest.py,里面定義兩個fixture函數(shù),一個用來讀取conf.yml里面的內容,另一個用來配置具體的環(huán)境信息
比如qa環(huán)境,release環(huán)境,然后通過conf.yml里面配置的qa還是release,來讀取project_url 和 mysql_url,截圖如下:
import pytest
import yaml
@pytest.fixture(scope="session")
def config():
with open('./conf.yml', 'r', encoding='utf-8') as f:
conf = yaml.load(f.read(), Loader=yaml.FullLoader)
return conf
@pytest.fixture(scope="session")
def env_vars(config):
env = config["env"]
mapping = {
"qa": {
"project_url": "http://121.42.15.146:9090",
"mysql_url": "192.168.1.1"
},
"release": {
"project_url": "https://release.com",
"mysql_url": "127.0.0.1"
}
}
project_url = mapping[env]["project_url"]
mysql_url = mapping[env]["mysql_url"]
return mysql_url, project_url項目代碼(還是之前的測試用例)如下:
import requests
def test_demo(env_vars):
mysql_url = env_vars[0]
print('mysql_url的地址是{}'.format(mysql_url))
project_url = env_vars[1]
resp = requests.get(project_url)
status_code = resp.status_code
assert status_code == 200命令行運行方式,正常運行即可,截圖如下:

結論
隨著 CI/CD 流水線普及,多環(huán)境并存已成常態(tài)。測試人員面臨的環(huán)境復雜度越來越高,若不能實現(xiàn)配置統(tǒng)一、切換自如,將嚴重拖慢測試效率,甚至引發(fā)線上事故。
環(huán)境切換看似是小問題,實則影響自動化測試流程的穩(wěn)定性與擴展性。掌握 Pytest 中的配置管理,就等于掌握了自動化測試的方向盤。
總的來說,Pytest的環(huán)境切換通過命令行參數(shù)、配置文件和插件支持,讓測試靈活適應各種場景。從單人開發(fā)到團隊協(xié)作,它都能大幅提升效率。這不僅是技術實踐,更是現(xiàn)代測試思維的體現(xiàn)。掌握環(huán)境切換,你的測試流程將更加順暢,代碼質量也能更上一層樓。
測試環(huán)境千萬條,配置管理第一條;配置不統(tǒng)一,Bug淚兩行。
以上就是Pytest多環(huán)境切換的常見方法介紹的詳細內容,更多關于Pytest多環(huán)境切換的資料請關注腳本之家其它相關文章!
相關文章
Python虛擬環(huán)境創(chuàng)建和使用方法(使用自帶的venv模塊)
這篇文章主要如何在Python中使用虛擬環(huán)境,包括創(chuàng)建、激活、使用、生成requirements.txt文件、卸載包和刪除虛擬環(huán)境,虛擬環(huán)境有助于隔離項目依賴,避免版本沖突,并便于部署,需要的朋友可以參考下2024-12-12
Python環(huán)境使用OpenCV檢測人臉實現(xiàn)教程
這篇文章主要介紹了Python環(huán)境使用OpenCV檢測人臉實現(xiàn)教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
Python刪除Java源文件中全部注釋的實現(xiàn)方法
這篇文章主要介紹了Python刪除Java源文件中全部注釋的實現(xiàn)方法,涉及Python讀取文件、正則匹配、字符串查找、替換等相關操作技巧,需要的朋友可以參考下2017-08-08
Python讀寫Excel大數(shù)據(jù)文件的3種有效方式對比
Python處理Excel大數(shù)據(jù)有很多方式,不過Excel撐死才104萬行,能有多大的數(shù)據(jù),本文主要介紹了三種常見方式,感興趣的小伙伴可以跟隨小編一起學習一下2025-09-09
Python深度學習之使用Albumentations對圖像做增強
諸如RandomCrop和CenterCrop之類的某些增強功能可能會變換圖像,使其不包含所有原始邊界框. 本示例說明如何使用名為RandomSizedBBoxSafeCrop的變換來裁剪圖像的一部分,但保留原始圖像的所有邊界框,需要的朋友可以參考下2021-05-05

