Pytest多環(huán)境切換的常見方法介紹
你是否也遇到過這種情況:本地測試通過,一到測試環(huán)境就翻車?環(huán)境變量錯(cuò)亂、接口地址混亂、數(shù)據(jù)源配置丟失……這些「環(huán)境切換」問題簡直像定時(shí)炸彈,隨時(shí)引爆你的測試流程!
測試人員每天都跟不同的環(huán)境打交道,比如線上環(huán)境,測試環(huán)境,預(yù)上線環(huán)境等等,那么作為自動化測試人員寫的代碼,我們也要具備能自由切換環(huán)境的能力,那么今天小編就給大家聊一下,如何能讓我們python語言寫的測試用例可以自由切換到不同的環(huán)境下面去運(yùn)行呢?
Pytest 作為自動化測試的主力框架,如何實(shí)現(xiàn)本地、測試、預(yù)發(fā)、生產(chǎn)環(huán)境的靈活切換?有沒有一種通用、實(shí)用、可復(fù)用的方案?
“Pytest如何實(shí)現(xiàn)環(huán)境切換,讓測試適應(yīng)不同場景?”這個(gè)問題曾讓我撓頭。配置文件怎么寫?參數(shù)怎么傳?能不能自動化切換而不用手動改代碼?帶著這些疑問,我開始摸索Pytest的環(huán)境管理功能。從簡單的命令行參數(shù)到復(fù)雜的配置文件,我發(fā)現(xiàn)它不僅靈活,還能無縫對接團(tuán)隊(duì)協(xié)作。那么,具體該怎么操作呢?接下來,讓我們一起進(jìn)入實(shí)戰(zhàn),揭開Pytest環(huán)境切換的奧秘。
今天給他大家聊一下通過pytest框架實(shí)現(xiàn)自由環(huán)境切換的幾種方法。
1.pytest-base-url
pytest有一個(gè)插件叫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這個(gè)命令,如下所示:
第2種使用方式是在pytest.ini配置文件種去配置base_url,然后自動讀取url的數(shù)據(jù),這樣就不用添加--base-url這個(gè)命令行參數(shù)了:
命令行直接運(yùn)行pytest 即可。
2.hooks函數(shù)
pytest有個(gè)hooks函數(shù),可以自定義命令行參數(shù),一般在conftest.py中去引用。
Conftest.py中寫pytest_addoption這個(gè)hooks函數(shù),可以自定義命令行參數(shù),base_url只能對一個(gè)url地址進(jìn)行傳遞,那么有的項(xiàng)目不僅需要多項(xiàng)目請求的url地址進(jìn)行不同環(huán)境的切換,還需要對mysql的url地址進(jìn)行不同的切換,這個(gè)時(shí)候就可以用自定義命令,定義不同的命令行參數(shù),這樣我們在執(zhí)行pytest的時(shí)候就可以自由進(jìn)行傳遞。
代碼如下:
通過pytest_addoption這個(gè)hooks函數(shù),設(shè)置了兩個(gè)命令行參數(shù),一個(gè)是--mysql-url,另一個(gè)是--project-url,help后面是對這兩個(gè)命令行的解釋,解釋說明這兩個(gè)命令行代表什么含義
import pytest def pytest_addoption(parser): parser.addoption( "--mysql-url", action="store", help="這里可以傳遞mysql的url地址" ) parser.addoption( "--project-url", action="store", help="這里可以傳遞項(xiàng)目的url地址" )
通過fixture函數(shù)中的request參數(shù)去讀取命令行中傳遞的參數(shù),賦值給一個(gè)變量,就可以在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
項(xiàng)目代碼如下:
fixture函數(shù)的調(diào)用,直接把fixture的名字當(dāng)成參數(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
運(yùn)行測試的命令為:
pytest -s --mysql -url 192.168.1.11--project-url http://www.example.com
如下圖所示:
3.yml和fixture
通過 yml文件 和 fixture 進(jìn)行配合使用,首先在項(xiàng)目目錄下面創(chuàng)建一個(gè)conf.yml,然后里面去手動配置現(xiàn)在要運(yùn)行的環(huán)境,截圖如下:
然后在創(chuàng)建一個(gè)conftest.py,里面定義兩個(gè)fixture函數(shù),一個(gè)用來讀取conf.yml里面的內(nèi)容,另一個(gè)用來配置具體的環(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
項(xiàng)目代碼(還是之前的測試用例)如下:
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
命令行運(yùn)行方式,正常運(yùn)行即可,截圖如下:
結(jié)論
隨著 CI/CD 流水線普及,多環(huán)境并存已成常態(tài)。測試人員面臨的環(huán)境復(fù)雜度越來越高,若不能實(shí)現(xiàn)配置統(tǒng)一、切換自如,將嚴(yán)重拖慢測試效率,甚至引發(fā)線上事故。
環(huán)境切換看似是小問題,實(shí)則影響自動化測試流程的穩(wěn)定性與擴(kuò)展性。掌握 Pytest 中的配置管理,就等于掌握了自動化測試的方向盤。
總的來說,Pytest的環(huán)境切換通過命令行參數(shù)、配置文件和插件支持,讓測試靈活適應(yīng)各種場景。從單人開發(fā)到團(tuán)隊(duì)協(xié)作,它都能大幅提升效率。這不僅是技術(shù)實(shí)踐,更是現(xiàn)代測試思維的體現(xiàn)。掌握環(huán)境切換,你的測試流程將更加順暢,代碼質(zhì)量也能更上一層樓。
測試環(huán)境千萬條,配置管理第一條;配置不統(tǒng)一,Bug淚兩行。
以上就是Pytest多環(huán)境切換的常見方法介紹的詳細(xì)內(nèi)容,更多關(guān)于Pytest多環(huán)境切換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python+OpenCV實(shí)現(xiàn)角度測量的示例代碼
本文介紹如何使用python語言實(shí)現(xiàn)角度測量,程序包括鼠標(biāo)選點(diǎn)、直線斜率計(jì)算、角度計(jì)算三個(gè)子程序和一個(gè)主程序,感興趣的可以了解一下2022-03-03Java byte數(shù)組操縱方式代碼實(shí)例解析
這篇文章主要介紹了Java byte數(shù)組操縱方式代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07淺談python對象數(shù)據(jù)的讀寫權(quán)限
下面小編就為大家?guī)硪黄獪\談python對象數(shù)據(jù)的讀寫權(quán)限。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09python?subprocess.run()、subprocess.Popen()、subprocess.check
Python的subprocess模塊是用于創(chuàng)建和管理子進(jìn)程的模塊,本文主要介紹了python?subprocess.run()、subprocess.Popen()、subprocess.check_output(),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02淺談使用Python內(nèi)置函數(shù)getattr實(shí)現(xiàn)分發(fā)模式
這篇文章主要介紹了淺談使用Python內(nèi)置函數(shù)getattr實(shí)現(xiàn)分發(fā)模式,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01