首先來看看設(shè)置unittest前置后置的方法:
unittest:
? ? ? ? ? setup/teardown
? ? ? ? ? setup當(dāng)中得到的變量,怎么傳遞給測試用例的:self.XXX = value
? ? ? ? ? setupClass,tearDownClass
? ? ? ? ? setupClass當(dāng)中得到的變量直撤,怎么傳遞給測試用例的:cls.XXX = value
fixture前置后置的方法:
原則上:先定義再調(diào)用非竿、共享。
定義:
1谊惭、用函數(shù)實(shí)現(xiàn)汽馋,函數(shù)名稱不固定。--- 如何知道它是前置還是后置圈盔?
@pytest.fixture
def fix():
? ? pass
2豹芯、前置操作和后置操作,寫在一個(gè)函數(shù)里驱敲。 --用yeild 關(guān)鍵字區(qū)分前置后置
? @pytest.fixture
def fix():
? ? 前置代碼
? ? yeild? #分隔線
? ? 后置代碼
3铁蹈、4個(gè)作用域,即給到這4個(gè)類型的語句試用的前置后置众眨,4選一握牧,默認(rèn)是測試函數(shù)類型。測試函數(shù)(function)娩梨、測試類(class)沿腰、測試模塊文件(module)、測試會(huì)話(session)
@pytest.fixture(scope=function(默認(rèn)值)/class/module/session)
def fix():
? ? ? ? 前置代碼
? ? ? ? yeild? #分隔線
? ? ? ? 后置代碼
4狈定、不跟測試類/測試函數(shù)放在一起颂龙。 ---如果說有測試類要用的話,怎么辦纽什?需要的時(shí)候再調(diào)用措嵌。
5、前置操作得到的一些數(shù)據(jù)芦缰,如何傳遞給測試用例企巢?
yeild返回值
在測試用例當(dāng)中:以fixture函數(shù)名作為用例參數(shù)。用例參數(shù)接收返回值让蕾。
測試函數(shù)的參數(shù):1浪规、fixture? 2或听、參數(shù)化
6、共享機(jī)制:conftest.py
conftest.py定義fixture,可以定義多個(gè)罗丰。
7神帅、調(diào)用:
用例/類 主動(dòng)調(diào)用fixtures.
? 哪兒需要哪兒調(diào):
@pytest.mark.usefixtures("fixture的函數(shù)名稱")
? 測試類/測試函數(shù)
如果fixture有返回值,那么萌抵,將它作為測試函數(shù)的參數(shù)時(shí)找御,則可以不用使用:@pytest.mark.usefixtures("fixture的函數(shù)名稱")
參考代碼:
conftest.py共享
原則上:
1、所在目錄下全面共享
2绍填、支持嵌套
conftest.py規(guī)則:
1霎桅、放的都是fixture
2、fixtures可以對外共享讨永。
3滔驶、共享的范圍:
? 當(dāng)前conftest.py所在目錄下的(含子孫目錄),所有用例共享
4卿闹、conftest.py揭糕,是可以創(chuàng)建多個(gè),在不同的包下锻霎≈牵可以層級創(chuàng)建的。
5旋恼、優(yōu)先級:就近原則@艨凇!
? ? 發(fā)現(xiàn)fiXture:用例自己的模塊 -》用例所在目錄下的conftest.py -》目錄的父級目錄下的conftest.py
6冰更、嵌套方式:
? 6.1什么時(shí)候嵌套产徊?? 一個(gè)fixture,想完全使用另外一個(gè)fixture,并在人家的基礎(chǔ)上新增一些代碼蜀细。
? 6.2怎么嵌套舟铜?
@pytest.fixture
def fix1():
? ? ? ? ? ?pass
@pytest.fixture
def fix2(fix1):
? ? ? ? ? ? #新增的代碼
? ? ? ? ? ? pass
6.3嵌套后的執(zhí)行順序?
? ? ? fix1的前置
? ? ? fix2的前置
? ? ? fix2的后置
? ? ? fix1的后置
? 6.4可以任意fixture級別嵌套嗎奠衔?
? ? ? fix1 >= fix2的級別
數(shù)據(jù)驅(qū)動(dòng)實(shí)現(xiàn):
@pytest.mark.parametrized()
在測試用例的前面加上:
@pytest.mark.parametrize("參數(shù)名",列表數(shù)據(jù))
參數(shù)名:用來接收每一項(xiàng)數(shù)據(jù)蛋褥,并作為測試用例的參數(shù)丧凤。
列表數(shù)據(jù):一組測試數(shù)據(jù)郭脂。
@pytest.mark.parametrize("參數(shù)1,參數(shù)2",[(數(shù)據(jù)1智亮,數(shù)據(jù)2),(數(shù)據(jù)1聂儒,數(shù)據(jù)2)])
示例:
@pytest.mark.parametrize("a,b,c",[(1,3,4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
? ? ? ? ? res = a + b
? ? ? ? ? assert res == c
組合參數(shù)化:多組參數(shù)迹恐,依次組合看彼。
使用多個(gè)@pytest.mark.parametrize
示例:用例有4個(gè):0,2/0,3/1,2/1,3 迪卡爾積
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
? ? ? ? ? pass
打標(biāo)記:mark功能
對用例打標(biāo)記瓷马,運(yùn)行的時(shí)候难捌,只運(yùn)行打標(biāo)記的用例膝宁。
300個(gè)回歸用例鸦难。-- 打標(biāo)記50個(gè),作為冒煙測試员淫。
1合蔽、得先注冊標(biāo)記名
pytest.ini
[pytest]
markers=
? ? ? ?標(biāo)簽名:說明(只能是英文)
? ? ? ? 標(biāo)簽名
? ? ? ? 標(biāo)簽名
圖示:
2、給測試用例/測試類打標(biāo)記
? @pytest.mark.已注冊的標(biāo)記名
3介返、運(yùn)行時(shí)設(shè)置只運(yùn)行標(biāo)記的用例
?使用方法-1: pytest命令行:-m標(biāo)記名
? 在收集到的所有用例當(dāng)中拴事,只運(yùn)行有標(biāo)記名的用例。
另外一種方式:
打標(biāo)記范圍:測試用例圣蝎、測試類刃宵、模塊文件
使用方法-2:
在測試類里,使用以下申明(測試類下徘公,所有用例都被打上該標(biāo)簽):
class TestClass(object):
? ? ? ? ?pytestmark = pytest.mark.已注冊標(biāo)簽名
? ? ? ? ?pytestmark = [pytest.mark.標(biāo)簽1, pytest.mark.標(biāo)簽2]? #多標(biāo)簽?zāi)J?/p>
在 模塊文件里牲证,同理(py文件下,所有測試函數(shù)和測試類里的測試函數(shù)关面,都有該標(biāo)簽):
import pytest
pytestmark = pytest.mark.webtest
pytestmark = [pytest.mark.標(biāo)簽1, pytest.mark.標(biāo)簽2]? #多標(biāo)簽?zāi)J?/p>
失敗重運(yùn)行機(jī)制? :
用例失敗的情況下坦袍,可以重運(yùn)行用例。
一旦用例失敗等太,馬上重運(yùn)行捂齐。重運(yùn)行的次數(shù)?
Pytest提供了失敗重試機(jī)制:
插件名稱:rerunfailures
? ? 安裝方法:pip install pytest-rerunfailures
使用方式:
命令行參數(shù)形式:
命令:pytest --reruns 重試次數(shù)
比如:pytest --reruns 2 表示:運(yùn)行失敗的用例可以重新運(yùn)行2次澈驼。
命令:pytest --reruns 重試次數(shù)--reruns-delay 次數(shù)之間的延時(shí)設(shè)置(單位:秒)
Pytest --reruns 2 --reruns-delay 5
? ? 表示失敗的用例可以重新運(yùn)行2次辛燥。第一次和第二次的間隔時(shí)間為5秒鐘。