1历造、pytest的規(guī)則:
①pytest支持 pip安裝。
> pip install pytest
②即測(cè)試文件和測(cè)試函數(shù)必須以“test”開(kāi)頭。這也是在執(zhí)行
“pytest”命令時(shí)并沒(méi)有指定測(cè)試文件也可以執(zhí)行 test_sample.py文件的原因帕膜,因?yàn)樵撐募?/p>
以“test”開(kāi)頭枣氧。
③通過(guò) main()方法執(zhí)行測(cè)試用例呢溢十?當(dāng)然可以垮刹,pytest同樣提供了
main()方法。
import pytest
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
if __name__ == '__main__':
pytest.main()
2张弛、基本用法:
①Fixture通常用來(lái)對(duì)測(cè)試方法荒典、測(cè)試函數(shù)、測(cè)試類(lèi)和整個(gè)測(cè)試文件進(jìn)行初始化或還原測(cè)試環(huán)境吞鸭。
主要用到模塊級(jí)別和函數(shù)級(jí)別的 Fixture寺董。
? setup_module/teardown_module:在當(dāng)前文件中,在所有測(cè)試用例執(zhí)行之前與之后
執(zhí)行刻剥。
? setup_function/teardown_function:在每個(gè)測(cè)試函數(shù)之前與之后執(zhí)行遮咖。
? setup/teardown:在每個(gè)測(cè)試函數(shù)之前與之后執(zhí)行。這兩個(gè)方法同樣可以作用于
類(lèi)方法
主要用到類(lèi)級(jí)別和方法級(jí)別的 Fixture造虏。
? setup_class/teardown_class:在當(dāng)前測(cè)試類(lèi)的開(kāi)始與結(jié)束時(shí)執(zhí)行御吞。
? setup_method/teardown_method:在每個(gè)測(cè)試方法開(kāi)始與結(jié)束時(shí)執(zhí)行。
? setup/teardown:在每個(gè)測(cè)試方法開(kāi)始與結(jié)束時(shí)執(zhí)行漓藕,同樣可以作用于測(cè)試函數(shù)陶珠。
運(yùn)行結(jié)果
②pytest是支持使用測(cè)試類(lèi)的,同樣必須以“Test”開(kāi)頭享钞,注意首字母大寫(xiě)揍诽。
③調(diào)用順序如下:setup_module>setup_class>setup_function>setup_method>setup>teardown>teardown_method>teardown_function>teardown_class>teardown_module
#coding:utf-8
import pytest
def multiply(a,b):
? ? return a*b
#-------------------Fixture------------
def setup_module(module):
? ? print("\nsetup_module,只執(zhí)行一次,當(dāng)有多個(gè)測(cè)試類(lèi)的時(shí)候使用")
def teardown_module(module):
? ? print("\nteardown_module,只執(zhí)行一次栗竖,當(dāng)有多個(gè)測(cè)試類(lèi)的時(shí)候使用")
def setup_function(function):
? ? print("\nsetup_function,在每個(gè)測(cè)試函數(shù)之前執(zhí)行暑脆。")
def teardown_function(function):
? ? print("\nteardown_function,在每個(gè)測(cè)試函數(shù)之后執(zhí)行。")
def setup():
? ? print("setup------每個(gè)測(cè)試方式都執(zhí)行一次----------->")
def teardown():
? ? print("teardown-----每個(gè)測(cè)試方式都執(zhí)行一次--------->")
def test_multiply_3_4():
? ? print('test_numbers_3_4')
? ? assert multiply(3,4) == 12
def test_multiply_2_3():
? ? print('test_strings_2_3')
? ? assert multiply(2,3) == 6
class TestPytest1(object):
? ? @classmethod
? ? def setup_class(cls):
? ? ? ? print("\nsetup_class,只執(zhí)行一次")
? ? @classmethod
? ? def teardown_class(cls):
? ? ? ? print("\nteardown_class狐肢,只執(zhí)行一次")
? ? def setup_method(self):
? ? ? ? print("\nsetup_method,每個(gè)測(cè)試方法都執(zhí)行一次")
? ? def teardown_method(self):
? ? ? ? print("\nteardown_method,每個(gè)測(cè)試方式都執(zhí)行一次")
? ? def setup(self):
? ? ? ? print("setup-----每個(gè)測(cè)試方式都執(zhí)行一次------------>>")
? ? def teardown(self):
? ? ? ? print("teardown----每個(gè)測(cè)試方式都執(zhí)行一次---------->>")
? ? def test_numbers_5_6(self):
? ? ? ? print('test_numbers_5_6')
? ? ? ? assert multiply(5,6) == 30
? ? def test_numbers_6_6(self):
? ? ? ? print('test_numbers_6_6')
? ? ? ? assert multiply(6,6) == 36
if __name__ == "__main__":
? ? pytest.main()
3添吗、參數(shù)化:
當(dāng)一組測(cè)試用例有固定的測(cè)試數(shù)據(jù)時(shí),就可以通過(guò)參數(shù)化的方式簡(jiǎn)化測(cè)試用例的編寫(xiě)处坪。
pytest本身是支持參數(shù)化的根资,不需要額外安裝插件。
#pytest參數(shù)化
@pytest.mark.parametrize(
? ? "base,exponent,expected",
? ? [(2,2,4),
? ? (2,3,8),
? ? (1,9,1),
? ? (0,9,0)],
? ? ids=["case1","case2","case3","case4"]
)
def test_pow(base,exponent,expected):
? ? assert math.pow(base,exponent) == expected
if __name__ == "__main__":
? ? pytest.main()
4同窘、運(yùn)行測(cè)試:
“-s”參數(shù)用于關(guān)閉捕捉玄帕,從而從控制臺(tái)輸出打印信息;
“-v”參數(shù)用于增加測(cè)試用例冗長(zhǎng)想邦,打印詳細(xì)的日志信息裤纹,方便定位問(wèn)題。
1.運(yùn)行名稱(chēng)中包含某字符串的測(cè)試用例
> pytest -k add test_assert.py
test_assert.py文件中,我們寫(xiě)了很多測(cè)試用例鹰椒,其中有 4條是關(guān)于 add()功能的锡移,并且在測(cè)試用例的名稱(chēng)上包含了“add”字符串,因此這里可以通過(guò)“-k”來(lái)指定在名稱(chēng)中包含“add”的測(cè)試用例漆际。
pytest -k "類(lèi)名"
pytest -k '方法名'
pytest -k ’類(lèi)名 and not 方法名‘#運(yùn)行類(lèi)里面所有的方法淆珊,不包含某個(gè)方法
2.減少測(cè)試的運(yùn)行冗長(zhǎng)
> pytest -q test_assert.py
“-q”用來(lái)減少測(cè)試運(yùn)行的冗長(zhǎng);也可以使用“--quiet”代替奸汇。
3.如果出現(xiàn)一條測(cè)試用例失敗施符,則退出測(cè)試
> pytest -x test_fail.py
這在測(cè)試用例的調(diào)試階段是有用的,當(dāng)出現(xiàn)一條失敗的測(cè)試用例時(shí)擂找,應(yīng)該先通過(guò)調(diào)試讓這條測(cè)試用例運(yùn)行通過(guò)戳吝,而不是繼續(xù)執(zhí)行后面的測(cè)試用例。
4.用例失敗個(gè)數(shù)達(dá)到閾值停止運(yùn)行贯涎。具體用法:
>pytest --maxfail=[num]
5.運(yùn)行測(cè)試目錄
> pytest ./test_dir
測(cè)試目錄既可以指定相對(duì)路徑(如 ./test_dir)听哭,也可以指定絕對(duì)路(D:\pytest\test_dir)
6.指定特定類(lèi)或方法執(zhí)行
> pytest test_fixtures_02.py::TestMultiply::test_numbers_5_6
這里指定運(yùn)行 test_fixtures_02.py文件中 TestMultiply類(lèi)下的 test_numbers_5_6()方法,文件名塘雳、類(lèi)名和方法名之間用“::”符號(hào)分隔陆盘。
7.通過(guò) main()方法運(yùn)行測(cè)試
import pytest
if __name__ == '__main__':
pytest.main(['-s', './test_dir'])
創(chuàng)建 run_tests.py文件,在文件中通過(guò)數(shù)組指定參數(shù)粉捻,每個(gè)參數(shù)為數(shù)組中的一個(gè)元素礁遣。