一、Unittest基本內(nèi)容
(一)基本名詞含義
Suit內(nèi)容:
TestCase:測(cè)試用例,最小的測(cè)試單元
TestSuit:多個(gè)測(cè)試用例的集合(至少一個(gè)測(cè)試用例),包括測(cè)試用例的預(yù)置步驟(執(zhí)行用例前執(zhí)行),后置步驟(執(zhí)行用例后執(zhí)行)
二园爷、Unittest基本方法
創(chuàng)建的用例集類必須繼承unittest.TestCase
(一)setUpClass與tearDownClass
setUpClass與tearDownClass在一個(gè)測(cè)試集中只會(huì)出現(xiàn)一次
import unittest
#創(chuàng)建的類必須繼承unittest.TestCase,否則是沒用的
class Test_suit(unittest.TestCase):
#setUpClass與tearDownClass使用前必須使用@classmethod裝飾器
@classmethod
def setUpClass(cls) -> None:
pass
#setUpClass是測(cè)試集執(zhí)行前最開始執(zhí)行的式撼,也只執(zhí)行一次
@classmethod
def tearDownClass(cls) -> None:
#要執(zhí)行什么代碼自己寫童社,cls與self一樣,同時(shí)cls后面接的參數(shù)可以在整個(gè)class中通用
pass
# tearDownClass是測(cè)試集執(zhí)行完畢再執(zhí)行的著隆,也只執(zhí)行一次
(二)setUp與tearDown
import unittest
class Test_suit(unittest.TestCase):
#setUpClass與tearDownClass使用前必須使用@classmethod裝飾器
@classmethod
def setUpClass(cls) -> None:
pass
#setUpClass與tearDown一樣只會(huì)出現(xiàn)一次叠洗,但是會(huì)在每次執(zhí)行用例前后分別執(zhí)行一次,與ddt一起使用特別明顯
#setUpClass是測(cè)試集執(zhí)行前最開始執(zhí)行的旅东,也只執(zhí)行一次
def setUp(self) -> None:
pass
def test_case1(self):
pass
#可以有多個(gè)用例
def test_case2(self):
pass
def tearDown(self) -> None:
pass
@classmethod
def tearDownClass(cls) -> None:
#要執(zhí)行什么代碼自己寫灭抑,cls與self一樣,同時(shí)cls后面接的參數(shù)可以在整個(gè)class中通用
pass
# tearDownClass是測(cè)試集執(zhí)行完畢再執(zhí)行的抵代,也只執(zhí)行一次
(三)添加用例
import unittest
class Test_suit(unittest.TestCase):
def test_case1(self):
print("測(cè)試1")
#可以有多個(gè)用例
def test_case2(self):
print("測(cè)試2")
if __name__ == '__main__':
# 創(chuàng)建測(cè)試套件
suite = unittest.TestSuite()
"""自動(dòng)讀取指令名稱開頭py文件內(nèi)的用例"""
# 指定識(shí)別測(cè)試用例的規(guī)則:識(shí)別所有test開頭的py文件為測(cè)試用例,按模塊名順序執(zhí)行
# tests = unittest.defaultTestLoader.discover('測(cè)試模塊所在目錄' , pattern = 'test*.py')
# suite.addTests(tests)
#單獨(dú)運(yùn)行某個(gè)用例
# suite.addTest(Test_suit('test_case1'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
(四)出報(bào)告
注意:
這里面有個(gè)坑腾节,不注意是出不了報(bào)告的,就是用例和出報(bào)告的文件要分別寫py文件
目錄結(jié)構(gòu):
目錄結(jié)構(gòu)
#test.py
import unittest
class Test_suit(unittest.TestCase):
def test_case1(self):
print("測(cè)試1")
#可以有多個(gè)用例
def test_case2(self):
print("測(cè)試2")
#result.py
import unittest
if __name__ == '__main__':
# 創(chuàng)建測(cè)試套件
suite = unittest.TestSuite()
"""自動(dòng)讀取指令名稱開頭py文件內(nèi)的用例"""
# 指定識(shí)別測(cè)試用例的規(guī)則:識(shí)別所有test開頭的py文件為測(cè)試用例,按模塊名順序執(zhí)行
# tests = unittest.defaultTestLoader.discover('測(cè)試模塊所在目錄' , pattern = 'test*.py')
tests = unittest.defaultTestLoader.discover(r'..\temp', pattern='test*.py')
suite.addTests(tests)
#單獨(dú)運(yùn)行某個(gè)用例
# suite.addTest(Test_suit('test_case2'))
with open('report.text','w') as rp:
runner = unittest.TextTestRunner(stream=rp,verbosity=2)
# runner = unittest.TextTestResult()
runner.run(suite)
三荤牍、Unittest斷言(全部)
(一)常用斷言方法
斷言方法 | 表達(dá)式 |
---|---|
assertIn | assertIn(self, member, container, msg=None) |
assertNotIn | assertNotIn(self, member, container, msg=None) |
assertIs | assertIs(self, expr1, expr2, msg=None) |
assertIsNot | assertIsNot(self, expr1, expr2, msg=None) |
assertEqual | assertEqual(self, first, second, msg=None) |
assertNotEqual | assertNotEqual(self, first, second, msg=None) |
assertTrue | assertTrue(self, expr, msg=None) |
assertFalse | assertFalse(self, expr, msg=None) |
assertTrue:斷言表達(dá)式是否為真案腺,可以直接寫大于,小于康吵,等于等,相當(dāng)于就是Python自帶的assert方法晦嵌,只是經(jīng)過改造了
(二)非常用斷言方法
斷言方法 | 表達(dá)式 |
---|---|
assertFalse | assertFalse(self, expr, msg=None) |
assertTrue | assertTrue(self, expr, msg=None) |
assertRaises | assertRaises(self, expected_exception, *args, **kwargs) |
assertWarns | assertWarns(self, expected_warning, *args, **kwargs) |
assertLogs | assertLogs(self, logger=None, level=None) |
assertAlmostEqual | assertAlmostEqual(self,first,second,places=None,msg=None,delta=None) |
assertNotAlmostEqual | assertNotAlmostEqual(self, first, second, places=None, msg=None, delta=None) 斷言序列一是否與序列二相等 |
assertListEqual | assertListEqual(self, list1, list2, msg=None) 斷言列表一是否與列表二相等 |
assertSetEqual | assertSetEqual(self, set1, set2, msg=None) |
assertDictEqual | assertDictEqual(self, d1, d2, msg=None) |
assertDictContainsSubset | assertDictContainsSubset(self, subset, dictionary, msg=None) |
assertCountEqual | assertCountEqual(self, first, second, msg=None) 一種無(wú)序的序列比較同辣,斷言相同的元素,忽視序列惭载。如果同一個(gè)元素出現(xiàn)多次旱函,它驗(yàn)證元素出現(xiàn)的次數(shù)是否相同。 |
zassertMultiLineEqualebra | assertMultiLineEqual(self, first, second, msg=None) first與second必須是一個(gè)字符串 |
assertLess(self, a, b, msg=None) | assertLess 斷言a<b是否成立描滔,不成立斷言失敗棒妨,并輸出msg |
assertLessEqual | assertLessEqual(self, a, b, msg=None) 斷言a<=b是否成立 |
assertGreater | assertGreater(self, a, b, msg=None) 斷言a>b是否成立,不成立斷言失敗 |
assertGreaterEqual | assertGreaterEqual(self, a, b, msg=None) |
assertIsNone | assertIsNone(self, obj, msg=None) |
assertIsNotNone | assertIsNotNone(self, obj, msg=None) 空列表也能斷言成功 |
assertRegex | assertRegex(self, text, expected_regex, msg=None) |