柚子快報邀請碼778899分享:Pytest學習筆記整理
柚子快報邀請碼778899分享:Pytest學習筆記整理
目錄
一、未分類-記錄點
二、測試方法
三、pytest測試搜索的命名規(guī)則
四、測試結(jié)果解讀
五、命令行選項解讀
六、關(guān)鍵文件解讀
七、fixture作用范圍解讀
八、pytest的內(nèi)置fixture
8.1 tmpdir和tmpdir_factory
8.2 pytestconfig
8.3 cache
8.4 capsys
8.5 monkeypatch
8.6 doctest_namespace
8.7 recwarn
九、裝飾器
@pytest.mark.parametrize()
@pytest.mark.usefixtures('fixture1','fixture2')
@pytest.fixture()
十、常用插件
待學習內(nèi)容
以下是Pytest的學習記錄,持續(xù)學習中。。。
一、未分類-記錄點
API與數(shù)據(jù)庫控制層交互,數(shù)據(jù)庫控制層與文檔數(shù)據(jù)庫(MongoDB或TinyDB)交互。
并非所有的測試代碼都要放到測試函數(shù)中
二、測試方法
單元測試檢查一小塊代碼(如一個函數(shù),或一個類)的測試集成測試檢查大段的代碼(如多個類,或一個子系統(tǒng))的測試。集成測試的規(guī)模介于單元測試與系統(tǒng)測試之間系統(tǒng)測試檢查整個系統(tǒng)的測試,通常要求測試環(huán)境盡可能接近最終用戶的使用環(huán)境功能測試檢查單個系統(tǒng)功能的測試。皮下測試subcutaneous test,不針對最終用戶界面,而是針對用戶界面以下的接口測試。
三、pytest測試搜索的命名規(guī)則
測試文件應(yīng)當命名為test_
四、測試結(jié)果解讀
PASSED(.)測試通過FAILED(F)測試失敗SKIPPED(s) 測試未被執(zhí)行。指定測試跳過執(zhí)行 可以將測試標記為@pytest.mark.skip() 或使用@pytest.mark.skipif()指定跳過測試的條件 xfail(x) 預期測試失敗,并且確實失敗 使用@pytest.mark.xfail()指定你認為會失敗的測試用例 XPASS(X)預期測試失敗,但實際上運行通過,不符合預期ERROR(E)測試用例之外的代碼觸發(fā)了異常
五、命令行選項解讀
--collect-only 展示有哪些用例將會被運行, 用于檢查選中的測試用例是否符合預期 -k EXPRESSION 使用表達式指定希望運行的測試用例, 篩選出用例名中含有表達式的用例 如:pytest -k “asdict or defaults” 篩選出用例名中含有asdict或者defaults的用例 -m MARKEXPR 用于標記分組 @pytest.mark.crud? 將用例標記為crud
-m “mark1 and mark2” 選中同時帶有mark1和mark2的標記用例-m “mark1 and not mark2" 選中mark1,過濾掉mark2的標記用例-m ”mark1 or mark2“ 選中有mark1或mark2的標記用例-x,--exitfirst失敗后停止執(zhí)行后面所有的用例--maxfail=num指定出現(xiàn)幾次失敗后停止執(zhí)行后面所有的用例-s 等價于--capture=on 允許終端在測試運行時輸出某些結(jié)果 --capture=method method有三種:no、sys、fd
--capture=sys? ?將sys.stdout/stderr輸出到內(nèi)存--capture=fd? ? ? 若文件描述符(file descriptor)為1或2時,被輸出至臨時文件中--capture=no 等價于-s--lf--last-failed 定位到最后一個失敗的測試用例重新執(zhí)行--ff --failed-first 與--lf作用基本相同,不同之處在于-ff會運行完剩余的測試用例。即,調(diào)整了用例的測試順序,上一輪失敗的先運行,再運行上一輪成功的用例 -v --verbose 輸出的信息會更詳細 -q --quite 與-v剛好相反,簡化輸出信息 我喜歡-q和--tb=line(僅打印異常的代碼位置)搭配使用 -l --showlocals 失敗用例由于被堆棧追蹤,所以局部變量及其值都會顯示出來 --tb=style 決定捕捉到失敗時輸出信息的顯示方式,即進行信息回溯 我推薦的style類型有:short、line、no
short模式:僅輸出assert的一行以及系統(tǒng)判定內(nèi)容(不顯示上下文)line模式:只使用一行輸出顯示所有的錯誤信息no模式:直接屏蔽全部回溯信息其他的類型還有:long、auto、native
--tb=long模式:輸出詳盡的回溯信息--tb=auto模式:默認值,如果有多個測試用例失敗,僅打印第一個和最后一個用例的回溯信息(格式與long模式一致)--tb=native模式:只輸出python標準庫的回溯信息,不顯示額外信息--duration=N 統(tǒng)計測試過程中哪幾個階段是最慢的(包括每個測試用例的call、setup、teardown過程) 顯示最慢的N個階段,耗時越長越靠前。 如使用--duration=0,則會將所有階段按耗時從長到短排序后顯示。 -rs查看跳過的原因,可以指令中加上-rs--setup-show看到測試過程中執(zhí)行的是什么fixture,以及執(zhí)行的先后順序--fixtures查詢fixture信息,包括重命名的fixture--cache-show顯示cache的內(nèi)容--cache-clear清除cache內(nèi)容
六、關(guān)鍵文件解讀
conftest.py 可選的 它是pytest的”本地插件庫“,其中可以包含hook函數(shù)和fixture。
hook函數(shù)可以將自定義邏輯引入pytest,用于改善pytest的執(zhí)行流程fixture則是一些用于測試前后執(zhí)行配置及銷毀邏輯的外殼函數(shù),可以傳遞測試中用到的資源。同一個項目中可以有多個conftest.py文件,如tests目錄下有一個,tests目錄的子目錄中各有一個 pytest.ini 可選的 它保存了pytest在該項目下的特定配置。項目中最多包含一個配置文件,其中的指令可以調(diào)節(jié)pytest的工作行為 __init__.pysetup.py對于創(chuàng)建可分發(fā)的包很重要
七、fixture作用范圍解讀
scope=”function“ scope參數(shù)的默認值 函數(shù)級別的fixture每個測試函數(shù)只需要運行一次。 scope=”class“ 類級別的fixture每個測試類只需要執(zhí)行一次 測試類里的所以方法都共享這個fixture scope=”module“ 模塊級別的fixture每個模塊只需要執(zhí)行一次 模塊內(nèi)的測試函數(shù)、類方法或其他fixture都共享這個fixture scope="session" 會話級別的fixture每次會話只需要執(zhí)行一次 一次pytest會話中的所有測試函數(shù)、方法都共享這個fixture
八、pytest的內(nèi)置fixture
8.1 tmpdir和tmpdir_factory
負責在測試開始運行前創(chuàng)建臨時文件目錄,并在測試結(jié)束后刪除。以下是兩者的對比:
tmpdirtmpdir_factory作用范圍函數(shù)級別會話級別tmpdir默認已經(jīng)存在一個dir tmpdir_factory需要先創(chuàng)建一個dir 創(chuàng)建文件夾a_sub_dir=tmpdir.mkdir('subdir') a_dir=tmpdir_factory.mktemp('mydir') a_sub_dir=a_dir.mkdir('subdir') 創(chuàng)建文件 a_file=tmpdir.join('file.txt') a_file=a_dir.join('file.txt')寫文件a_file.write('Content xxxxx')a_file.write('Content xxxxx')讀文件a_file.read()a_file.read()
# 通過以下方法可以獲取到根目錄
base_temp=tmpdir_factory.getbasetemp()?
# 也可以指定根目錄
base_temp=mydir?
8.2 pytestconfig
pytestconfig是request.config的快捷方式
通過命令行參數(shù)、選項、配置文件、插件、運行目錄等方式來控制pytest。
pytestconfig.argspytestconfig.inifilepytestconfig.invocation_dirpytestconfig.rootdir pytestconfig.getoption('keyword') pytestconfig.getoption('verbose') pytestconfig.getoption('quiet') pytestconfig.getoption('showlocals') pytestconfig.getoption('tbstyle')
8.3 cache
cache的作用是存儲一段測試會話的信息,在下一段測試會話中使用。如提供--lf和--ff標識。
支持--cache-show、--cache-clear指令。
cache.get(key,default) cache.set(key,value)
8.4 capsys
capsys有兩個功能:允許使用代碼讀取stdout和stderr;可以臨時禁止抓取日志信息。
capsys.readouterr()capsys.disabled()
8.5 monkeypatch
monkeypatch可以在運行期間對類或模塊進行動態(tài)修改,測試結(jié)束所有修改都會復原。
monkeypatch.setattr(target,name,value=
8.6 doctest_namespace
8.7 recwarn
九、裝飾器
@pytest.mark.parametrize()
# 某個參數(shù)定義多個取值?
@pytest.mark.parametrize('testname',['param1','param2','param3'])
def test_fun(testname):
pass
# 定義多個參數(shù)
@pytest.ark.parameterize('testA,testB',[('A1','B1'),('A2','B2'),('A3','B3'),])
def test_fun(testA,testB):
pass
#如果函數(shù)上分別定義兩個參數(shù),則運行時為兩個參數(shù)的笛卡爾積,按照('A1','B1'),('A1','B2'),('A1','B3'),('A2','B1'),('A2','B2'),('A2','B3'),('A3','B1'),('A3','B2'),('A3','B3'),傳參
@pytest.ark.parameterize('testA',[('A1','A2','A3',]) # 定義多個參數(shù)
@pytest.ark.parameterize('testB',[('B1','B2','B3',]) # 定義多個參數(shù)
def test_fun(testA,testB):
pass
@pytest.mark.usefixtures('fixture1','fixture2')
使用usefixtures和在測試方法中添加fixture參數(shù),二者大體上是差不多的,區(qū)別之一在于只有后者才能使用fixture的返回值。
@pytest.fixture()
# 一次會話執(zhí)行一次
@pytest.fixture(scope='session')?
# 所在的每個測試都會執(zhí)行,autouse特性更像是一個特例,而非規(guī)則。
# 設(shè)置成autouse=True的fixture不需要被測試用例引用
@pytest.fixture(autouse=True)? ?
# 給fixture重命名
@pytest.fixture(name='alias')? ?
# fixture參數(shù)化,并進行參數(shù)標識
@pytest.fixture(params=參數(shù),ids=參數(shù)標識)?
# 對于fixture的參數(shù)化,可以在函數(shù)中加入request,參數(shù)調(diào)用使用request.param
@pytest.fixture(params='mongo','tiny'])
def fun(tmpdir_factory,request):
????????print(request.param)
十、常用插件
改變測試流程的插件pytest-repeat重復運行測試pytest-xdist并行運行測試pytest-timeout為測試設(shè)置時間限制改善輸出效果的插件pytest-instafail查看錯誤的詳細信息pytest-sugar顯示色彩和進度條pytest-emoji為測試增添一些樂趣pytest-html為測試生成HTML報告靜態(tài)分析用的插件 pytest-pycodestype pytest-pep8 Python代碼風格檢查pytest-flake8更多的風格檢查Web開發(fā)用的插件pytest-selenium借助瀏覽器完成自動化測試pytest-django測試Django應(yīng)用pytest-flask測試Flask應(yīng)用其他pytest-assume斷言報錯后依然執(zhí)行pytest-cov測試覆蓋率pytest-freezegun冰凍時間pytest-httpserver模擬HTTP服務(wù)pytest-mock模擬未實現(xiàn)的部分pytest-ordering調(diào)整執(zhí)行順序pytest-picked運行未提交git的用例pytest-rerunfailures失敗重試pytest-random-order隨機順序執(zhí)行
待學習內(nèi)容
重新運行失敗測試遇到失敗即停止所有測試控制堆棧跟蹤控制日志輸出測試函數(shù)使用斷言語句marker標記功能的用法:測試歸類/分組、測試標記為skip(跳過不執(zhí)行)、告知某些測試一定失敗?測試目錄、測試模塊、測試類、將測試數(shù)據(jù)、啟動邏輯、銷毀邏輯放入fixturefixture實現(xiàn)對數(shù)據(jù)庫進行初始化,寫入數(shù)據(jù)以備測試之用fixture支持參數(shù),利用參數(shù),只需編寫一份代碼,可以針對TinyDB和MongoDB開展測試內(nèi)置fixture可滿足的常見需求:生成和銷毀臨時目錄、截取輸出流(通過日志判定結(jié)果)、使用monkey patch、檢查是否發(fā)出警告在pytest中添加命令行選項改進打印輸出打包分發(fā)自己編寫的插件共享定制化的pytest(包括fixture)學習測試自己的測試插件(元插件)一些熱門的社區(qū)插件修改默認配置,pytest.ini文件,或者tox.ini、setup.cfg文件借助tox使項目可以在多個Python版本上運行測試CLI部分,而不必mock系統(tǒng)的其余部分借助coverage.py檢查項目代碼塊的測試覆蓋情況通過Jenkins發(fā)起測試并實時顯示結(jié)果讓pytest運行基于unittest的測試用例把pytest的fixture共享給unittest的測試用例使用
柚子快報邀請碼778899分享:Pytest學習筆記整理
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。