你是否也遇到過這種情況:本地測試通過,一到測試環境就翻車?環境變量錯亂、接口地址混亂、數據源配置丟失……這些「環境切換」問題簡直像定時炸彈,隨時引爆你的測試流程!
測試人員每天都跟不同的環境打交道,比如線上環境,測試環境,預上線環境等等,那么作為自動化測試人員寫的代碼,我們也要具備能自由切換環境的能力,那么今天小編就給大家聊一下,如何能讓我們python語言寫的測試用例可以自由切換到不同的環境下面去運行呢?
Pytest 作為自動化測試的主力框架,如何實現本地、測試、預發、生產環境的靈活切換?有沒有一種通用、實用、可復用的方案?
“Pytest如何實現環境切換,讓測試適應不同場景?”這個問題曾讓我撓頭。配置文件怎么寫?參數怎么傳?能不能自動化切換而不用手動改代碼?帶著這些疑問,我開始摸索Pytest的環境管理功能。從簡單的命令行參數到復雜的配置文件,我發現它不僅靈活,還能無縫對接團隊協作。那么,具體該怎么操作呢?接下來,讓我們一起進入實戰,揭開Pytest環境切換的奧秘。
今天給他大家聊一下通過pytest框架實現自由環境切換的幾種方法。
1 pytest-base-url
pytest有一個插件叫pytest-base-url?,是管理base_url非常好的一款插件,文檔資料鏈接:https://pypi.org/project/pytest-base-url/
下載方式:
pip install pytest-base-url
案例如下:
import requestsdef test_demo(base_url):resp = requests.get(base_url)status_code = resp.status_codeassert status_code == 200
?
第1種使用方式是終端添加--base-url這個命令,如下所示:
第2種使用方式是在pytest.ini配置文件種去配置base_url,然后自動讀取url的數據,這樣就不用添加--base-url這個命令行參數了:
命令行直接運行pytest 即可。
2 hooks函數
pytest有個hooks函數,可以自定義命令行參數,一般在conftest.py中去引用。
Conftest.py中寫pytest_addoption這個hooks函數,可以自定義命令行參數,base_url只能對一個url地址進行傳遞,那么有的項目不僅需要多項目請求的url地址進行不同環境的切換,還需要對mysql的url地址進行不同的切換,這個時候就可以用自定義命令,定義不同的命令行參數,這樣我們在執行pytest的時候就可以自由進行傳遞。
代碼如下:
通過pytest_addoption這個hooks函數,設置了兩個命令行參數,一個是--mysql-url,另一個是--project-url,help后面是對這兩個命令行的解釋,解釋說明這兩個命令行代表什么含義
import pytestdef pytest_addoption(parser):parser.addoption("--mysql-url", action="store", help="這里可以傳遞mysql的url地址")parser.addoption("--project-url", action="store", help="這里可以傳遞項目的url地址")
通過fixture函數中的request參數去讀取命令行中傳遞的參數,賦值給一個變量,就可以在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函數的調用,直接把fixture的名字當成參數傳遞到測試用例里面即可
import requestsdef 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_codeassert status_code == 200
運行測試的命令為:
pytest?-s --mysql -url?192.168.1.11--project-url http://www.example.com
如下圖所示:
3 yml和fixture
通過?yml文件?和?fixture?進行配合使用,首先在項目目錄下面創建一個conf.yml,然后里面去手動配置現在要運行的環境,截圖如下:
然后在創建一個conftest.py,里面定義兩個fixture函數,一個用來讀取conf.yml里面的內容,另一個用來配置具體的環境信息
比如qa環境,release環境,然后通過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 requestsdef 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_codeassert status_code == 200
命令行運行方式,正常運行即可,截圖如下:
結論
隨著 CI/CD 流水線普及,多環境并存已成常態。測試人員面臨的環境復雜度越來越高,若不能實現配置統一、切換自如,將嚴重拖慢測試效率,甚至引發線上事故。
環境切換看似是小問題,實則影響自動化測試流程的穩定性與擴展性。掌握 Pytest 中的配置管理,就等于掌握了自動化測試的方向盤。
總的來說,Pytest的環境切換通過命令行參數、配置文件和插件支持,讓測試靈活適應各種場景。從單人開發到團隊協作,它都能大幅提升效率。這不僅是技術實踐,更是現代測試思維的體現。掌握環境切換,你的測試流程將更加順暢,代碼質量也能更上一層樓。
測試環境千萬條,配置管理第一條;配置不統一,Bug淚兩行。