咱們能夠直接在測試用例裏面添加unittest框架自帶的斷言(也就至關於判斷),斷言方法提供了測試結果是True仍是False,全部的斷言方法都有一個msg參數,若是指定msg參數的值,則將該信息做爲失敗的錯誤信息返回;html
若是斷言失敗則拋出一個AssertionError,並標識該測試爲失敗狀態;若是成功,則標識該測試爲成功狀態;若是異常,則當作錯誤來處理;框架
先來看一個實例,在一個測試類MyTestCase中添加多個測試方法和斷言less
from unittest import TestCase, main, skip class MyTestCase(TestCase): def setUp(self): print('setUp') def tearDown(self): print('tearDown') def test_print1(self): print('第一個測試用例') # unittest框架自帶的斷言,若是不相等,直接拋出異常,相等什麼都不作 self.assertEqual(200, 200, '測試失敗') def test_print2(self): print('第二個測試用例') def test_print3(self): print('第三個測試用例') if __name__ == '__main__': main() ========輸出========: setUp 第一個測試用例 tearDown setUp 第二個測試用例 tearDown setUp 第三個測試用例 tearDown
這裏有三個測試用例,每一個測試用例開始以前都先執行了setUp方法,每一個測試用例以後都執行了tearDown方法。若是咱們想要忽略某個測試用例不執行,要怎麼作?好比忽略第三個測試用例,只須要在第三個測試用例以前加上skip裝飾器:函數
@skip('do not need test_print3') def test_print3(self): print('第三個測試用例')
咱們可使用unitest.skip裝飾器跳過不須要的測試用例,@unittest.skip(reason)
表示無條件跳過測試用例,reason是用來講明緣由的;學習
@unittest.skipIf(conditition,reason)
:condititon爲true時跳過測試用例;測試
@unittest.skipunless(condition,reason)
:condition爲False時跳過測試用例;ui
以前咱們學習了setup方法和setUpClass方法,會在每一個測試用例的先後都執行一遍,那若是咱們只想要在全部測試用例的先後執行一遍,也就是在整個類中只執行一遍要怎麼辦呢,咱們可使用setUpClass方法和tearDownClass方法:code
from unittest import TestCase, main, skip class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): print('第一個測試用例') # unittest框架自帶的斷言,若是不相等,直接拋出異常,相等什麼都不作 self.assertEqual(200, 200, '測試失敗') def test_print2(self): print('第二個測試用例') @skip('do not need test_print3') def test_print3(self): print('第三個測試用例') if __name__ == '__main__': main() ==========輸出=========== setUpClass 第一個測試用例 第二個測試用例 tearDownClass
setup方法和teardown方法在每次執行一個測試用例時都會從新執行一遍,因此要想在整個類中只執行一遍能夠用setUpClass和tearDownClass方法;htm
setUpClass
:須要添加@classmethod 裝飾器,在一個類中只會在全部測試用例運行前調用一次;ip
tearDownClass
:須要添加@classmethod 裝飾器,在全部測試用例運行後調用一次;
unittest.TestSuite類
建立測試套件,而後使用這個類的addTest() 方法將須要被測試的測試用例添加到測試套件中,最後使用unittest.TextTestRunner類
中的run()方法來運行suite所組裝的測試用例;from unittest import TestCase from unittest import skip from unittest import main as main_method class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): print('第一個測試用例') self.assertEqual(200, 200, '測試失敗') def test_print2(self): print('第一個測試用例') @skip('do not need test_print3') def test_print3(self): print('第一個測試用例') if __name__ == '__main__': main_method()
from test1 import MyTestCase from unittest import TestSuite, TextTestRunner suite = TestSuite() # 在測試用例集中添加測試用例, 只添加兩個測試的方法 suite.addTest(MyTestCase('test_print1')) suite.addTest(MyTestCase('test_print3')) if __name__ == '__main__': # 建立測試runner,執行測試用例集 runner = TextTestRunner() runner.run(suite) =========輸出============= setUpClass 第一個測試用例 tearDownClass
咱們運行這段代碼,只有第一個測試用例輸出,由於咱們只將第一個和第三個測試用例加入到測試集中,全部第二個測試用例不會執行,而咱們在第三個測試用例前面機上了skip裝飾器會跳過此測試用例,全部第三個也不會執行啦。
def add(x, y): return x + y def sub(x, y): return x - y
from unittest import TestCase from unittest import skip from unittest import main as main_method from add_sub import add, sub class MyTestCase(TestCase): @classmethod def setUpClass(cls): print('setUpClass') @classmethod def tearDownClass(cls): print('tearDownClass') def test_print1(self): ret = 1 + 2 result = add(1, 2) self.assertEqual(result, ret, 'test_print1測試失敗') def test_print2(self): print('第二個測試用例') @skip('do not need test_print3') def test_print3(self): print('第三個測試用例') if __name__ == '__main__': main_method()
from test import MyTestCase from unittest import TestSuite, TextTestRunner suite = TestSuite() # 在測試用例集中添加測試用例 suite.addTest(MyTestCase('test_print1')) suite.addTest(MyTestCase('test_print2')) suite.addTest(MyTestCase('test_print3')) if __name__ == '__main__': # 建立測試runner,執行測試用例集 runner = TextTestRunner() runner.run(suite) ========輸出========= setUpClass 第一個測試用例 第二個測試用例 tearDownClass