unittest斷言的使用

斷言使用

  • 咱們能夠直接在測試用例裏面添加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('第三個測試用例')

skip裝飾器

  • 咱們可使用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

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

參考:https://www.9xkd.com/user/plan-view.html?id=4822012440

相關文章
相關標籤/搜索