柚子快報(bào)邀請(qǐng)碼778899分享:pytest對(duì)代碼進(jìn)行封裝
柚子快報(bào)邀請(qǐng)碼778899分享:pytest對(duì)代碼進(jìn)行封裝
目錄
用例管理框架Pytest
request請(qǐng)求頭的四種傳參方式
requests.request()和sessionrequest()的區(qū)別
接口自動(dòng)化測(cè)試框架代碼封裝
統(tǒng)一請(qǐng)求封裝,基本放在commons內(nèi))
pytest的作用
pytest的使用
把項(xiàng)目跑起來(lái)的方法:
不管是哪種方式運(yùn)行測(cè)試用例,都會(huì)讀取pytest.ini配置文件
pytest的前后置fixture(固件、夾具)
yield
yaml文件有哪些形式的內(nèi)容(yaml支持各種不同數(shù)據(jù)類型)
DDT數(shù)據(jù)驅(qū)動(dòng)測(cè)試
解決數(shù)據(jù)驅(qū)動(dòng)遇到的問(wèn)題
用例管理框架Pytest
pytest可以結(jié)合selenium、requests、appium實(shí)現(xiàn)web、接口、app自動(dòng)化
結(jié)合allure生成非常美觀的報(bào)告和結(jié)合jenkins實(shí)現(xiàn)持續(xù)集成
很多強(qiáng)大插件:
pytest 本身 pytest-html 生成html報(bào)告 pytest-xdist 多線程執(zhí)行 pytest-ordering 控制用例的執(zhí)行順序 pytest-rerunfailures 失敗用例重跑 pytest-base-url 基礎(chǔ)路徑 allure-pytest 生成測(cè)試報(bào)告
一般項(xiàng)目會(huì)把所需的包用requirements.txt存放在根目錄
然后在終端輸入:
pip install -r requirements.txt
就可以把所需對(duì)應(yīng)版本號(hào)的包都下載進(jìn)項(xiàng)目了
request請(qǐng)求頭的四種傳參方式
from-datya(既有表單也有文件上傳)file x-www-form-unlencoded(純表單) data raw(接送:application/json)(傳json格式的參數(shù)) json binary(application/octrent-stream):(二進(jìn)制文件) data
requests.request()和sessionrequest()的區(qū)別
前者每個(gè)清華求都是獨(dú)立的,后者會(huì)自動(dòng)關(guān)聯(lián)所有請(qǐng)求的cookie信息
接口自動(dòng)化測(cè)試框架代碼封裝
統(tǒng)一請(qǐng)求封裝,基本放在commons內(nèi))
實(shí)際工作中先封裝再寫(xiě)測(cè)試用例
可以減少代碼冗余,比如異常處理和日志監(jiān)控不用在每個(gè)方法里寫(xiě),在commons里面寫(xiě)就可以了
pytest的作用
發(fā)現(xiàn)用例
模塊名字必須以test開(kāi)通或者test結(jié)尾 測(cè)試類必須以Test開(kāi)頭 測(cè)試方法必須以test_開(kāi)頭 執(zhí)行用例 判斷結(jié)果 生成報(bào)告
pytest的使用
把項(xiàng)目跑起來(lái)的方法:
在終端輸入pyest 在根目錄新建一個(gè)python文件叫:run.py if __name__ == '__main__':
? ?pytest.main() 通過(guò)配置pytest.ini來(lái)改變以及執(zhí)行用例
不管是哪種方式運(yùn)行測(cè)試用例,都會(huì)讀取pytest.ini配置文件
[pytest]
#配置參數(shù)
#-v代表輸出更詳細(xì)信息
#-s代表?xiàng)l數(shù)的信息
#加了-m "smoke"表示只運(yùn)行冒煙測(cè)試的測(cè)試用例
#如果想用多個(gè)標(biāo)志詞,可以使用or,比如:-m "smoke or user"
addopt = -vs -m "smoke"
#改變用例的查找規(guī)則
testpaths = ./testcases#指定查找測(cè)試用例的路徑
#改變模塊的查找規(guī)則
#*號(hào)代表不同的內(nèi)容,字母表示確定的文件名
python_files = test_*.py
#改變類的查找規(guī)則
python_classes =Test*
#改變函數(shù)的查找規(guī)則
python_functtions = test_*
#加一個(gè)基礎(chǔ)路徑(測(cè)試環(huán)境),url是一個(gè)網(wǎng)址
base_url:url
#標(biāo)記,可以寫(xiě)多個(gè)標(biāo)志詞
markers =
smoke:冒煙測(cè)試
user:用戶管理
pytest的前后置fixture(固件、夾具)
用例前置:用例前置的作用就是準(zhǔn)備測(cè)試用例的前置條件和測(cè)試數(shù)據(jù),相當(dāng)于 unittest 中的 setup() 的功能; 用例后置:用例后置的作用就是在測(cè)試用例執(zhí)行完畢之后進(jìn)行前置條件和測(cè)試數(shù)據(jù)的清理、復(fù)原等工作,總之就是你想在測(cè)試用例執(zhí)行完之后干的事都在這里干就行了,沒(méi)有想干的事情也可以空著,相當(dāng)于 unittest 中的 teardown() 的功能;
更強(qiáng)大的前后置(前后置指測(cè)試用例執(zhí)行前或之后的一些操作):fixture固件
首先要知道fixture是裝飾器:
什么是裝飾器:用來(lái)裝飾函數(shù)或者類
@pytest.fixture(scope="作用域",params="參數(shù)化",autouse="是否自動(dòng)執(zhí)行",ids="參數(shù)別名",name=
"裝飾器別名")
scope :可以填function、class、module、session,分表代表作用域是函數(shù)還是類還是。。。
autiuse:只有True和Fales,表示是否自動(dòng)執(zhí)行
params:參數(shù)化,只能傳一個(gè)列表(list里面可以以結(jié)構(gòu)體進(jìn)行傳值,比如字典、列表等),需要用request和yield request.param
ids:參數(shù)別名
name:夾具別名
yield
fixture夾具函數(shù)搭配yield使用:
yield?之前的是用例前置部分,用例前置條件在此處實(shí)現(xiàn)
yield?是 python 中的迭代器,它的作用:
一是將用例前置準(zhǔn)備好的測(cè)試數(shù)據(jù)返回給調(diào)用方,
二是讓 python?跳出這個(gè)?fixture?函數(shù),去執(zhí)行測(cè)試用例的代碼,在測(cè)試用例執(zhí)行完后再回來(lái)繼續(xù)執(zhí)行?yield?之后的代碼;
yield?之后的是用例后置部分,用例前置條件的拆卸、數(shù)據(jù)清理在此處實(shí)現(xiàn)
例子:
# conftest.py
# step 1. 先導(dǎo)入 pytest
import pytest
from selenium import webdriver
# step 2. 使用 @pytest.fixture() 裝飾 fixture;
@pytest.fixture()
# step 3. 定義函數(shù),函數(shù)名可以自定義,但是最好要有意義;
def fix_init_chrome():
"""啟動(dòng)/關(guān)閉 chrome瀏覽器"""
# step 4. 實(shí)現(xiàn)用例前置
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.maximize_window()
# step 5. 返回?cái)?shù)據(jù)
yield driver
# step 6. 實(shí)現(xiàn)用例后置
driver.close()
使用說(shuō)明: step 2 :必須要用 @pytest.fixture() 裝飾函數(shù),才會(huì)被注冊(cè)為 pytest 的 fixture;
step 4 :yield 之前的是用例前置部分,用例前置條件在此處實(shí)現(xiàn),例如:初始化chrome,打開(kāi)百度網(wǎng)頁(yè),最大化窗口等;
step 5 :yield 是 python 中的迭代器,它的作用:一是將用例前置準(zhǔn)備好的測(cè)試數(shù)據(jù)返回給調(diào)用方,二是讓 python 跳出這個(gè) fixture 函數(shù),去執(zhí)行測(cè)試用例的代碼,在測(cè)試用例執(zhí)行完后再回來(lái)繼續(xù)執(zhí)行 yield 之后的代碼;
step 6 :yield 之后的是用例后置部分,用例前置條件的拆卸、數(shù)據(jù)清理在此處實(shí)現(xiàn),例如:關(guān)閉chrome瀏覽器,此處執(zhí)行完畢后整個(gè)用例才算執(zhí)行完畢;
注意:yield 也可以替換為 return,但是 return 之后就視為此函數(shù)的代碼執(zhí)行完畢,return 之后就不能在寫(xiě)用例后置部分的代碼,所以建議都使用 yield ,就算不需要用例后置也可以空著!
圖片說(shuō)明了讀取params里面的值的傳值過(guò)程
先在params定義要傳的數(shù)據(jù)---->數(shù)據(jù)傳到request(這個(gè)單詞是固定寫(xiě)法)---->傳到y(tǒng)ield里面(yield request.params的寫(xiě)法是固定的)--->通過(guò)手動(dòng)執(zhí)行,在測(cè)試用例里面填寫(xiě)夾具函數(shù)的函數(shù)名進(jìn)行調(diào)用---->然后在測(cè)試函數(shù)內(nèi)就可以打印出params的數(shù)據(jù)
params里面有多少數(shù)據(jù)就調(diào)用測(cè)試函數(shù)多少次
yaml文件有哪些形式的內(nèi)容(yaml支持各種不同數(shù)據(jù)類型)
map對(duì)象(字典dict)? ? ?鍵: 值? ? ? :雙引號(hào)后面記得要帶空格數(shù)組對(duì)象(列表list)? ? ? 用一組-開(kāi)頭的
????????例子:
? ? ? ? ? ? ? ? 第一種:? ? ? keys: aaabbb? ? ? 第一種解析出來(lái)是字典
? ? ? ? ? ? ? ? 第二種:? ? ? - name: 張三
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? - like: 翠花
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第二種解析出來(lái)的是[{name:"張三"},{like:"翠花"}]
DDT數(shù)據(jù)驅(qū)動(dòng)測(cè)試
@pytest.mark.parametrize("數(shù)據(jù)驅(qū)動(dòng)的參數(shù)名","數(shù)據(jù)驅(qū)動(dòng)的值")
parametrize傳值過(guò)程:
caseinfo是參數(shù)名,caseinfo里面有["百里","北凡"]這些數(shù)據(jù),
測(cè)試用例調(diào)用caseinfo一次就使用列表里面的一個(gè)元素,因?yàn)榱斜碛袃蓚€(gè)元素測(cè)試用例就被調(diào)用了兩次
解決數(shù)據(jù)驅(qū)動(dòng)遇到的問(wèn)題
如果有接口關(guān)聯(lián),那么需要在關(guān)聯(lián)的接口調(diào)用前通過(guò)調(diào)用方法覆蓋舊的值,來(lái)實(shí)現(xiàn)更新yaml文件的value值,比如:在yaml中調(diào)用隨機(jī)數(shù)方法一個(gè)接口對(duì)應(yīng)一個(gè)yaml,如果一個(gè)接口有很多反例,那么yaml里面會(huì)有很多數(shù)據(jù)
柚子快報(bào)邀請(qǐng)碼778899分享:pytest對(duì)代碼進(jìn)行封裝
精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。