1. 程式人生 > >單元測試-unittest

單元測試-unittest

ascii pre CI n) EDA 添加 ron 測試結果 TE

一、簡介

unittest單元測試框架可組織執行測試用例,並且提供了豐富的斷言方法,判斷測試用例是否通過,最終生成測試結果。

二、屬性介紹

1、unittest模塊的各個屬性

unittest.TestCase:TestCase類,所有測試用例類繼承的基本類。

unittest.main():將一個單元測試模塊變為可直接運行的測試腳本,main方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測試方法,並自動執行它們。執行方法的默認順序是: 根據ASCII碼的順序加載測試用例,數字與字母的順序為0-9、A-Z、a-z。

unittest.TestSuite():創建測試套件

unittest.TextTextRunner():unittest框架的TextTextRunner類,通過該類的run()方法來運行suite所組裝的測試用例,參數是suite測試套件

unittest.dedaultTestLoaser():defaultTestLoader()類,通過該類下的discover方法,可自動根據測試目錄匹配查找測試用例文件(test*.py),並將查找到的測試用例組裝到測試套件,因此可以直接通過run()方法執行discover.

unittest.skip():裝飾器,當運行用例時,有些用例可能不想執行等,可用裝飾器暫時屏蔽該條測試用例。一種常見的用法就是比如說想調試某一個測試用例,想先屏蔽其他用例就可以用裝飾器屏蔽。

@unittest.skip(reason): skip(reason)裝飾器:無條件跳過裝飾的測試,並說明跳過測試的原因。

@unittest.skipIf(reason): skipIf(condition,reason)裝飾器:條件為真時,跳過裝飾的測試,並說明跳過測試的原因。

@unittest.skipUnless(reason): skipUnless(condition,reason)裝飾器:條件為假時,跳過裝飾的測試,並說明跳過測試的原因。

@unittest.expectedFailure(): expectedFailure()測試標記為失敗。

2、TestCase類的屬性:

setUp():setUp()方法用於每個測試用例執行前的初始化工作。如測試用例中需要訪問數據庫,可以在setUp中建立數據庫連接並進行初始化。如測試用例需要登錄web,可以先實例化瀏覽器。

tearDown():tearDown()方法用於每個測試用例執行之後的善後工作。如關閉數據庫連接。關閉瀏覽器。

assert*():一些斷言方法:在執行測試用例的過程中,最終用例是否執行通過,是通過判斷測試得到的實際結果和預期結果是否相等決定的。

assertEqual(a,b,[msg=‘測試失敗時打印的信息‘]):斷言a和b是否相等,相等則測試用例通過。

assertIn(a,b,[msg=‘測試失敗時打印的信息‘]):斷言a是否在b中,在b中則測試用例通過。

3、TestSuite類的屬性

addTest(): addTest()方法是將測試用例添加到測試套件中,一次只能添加一個測試用例,如下方,是將本模塊下的MyTest類下的testcasea測試用例添加到測試套件中

suite=unittest.TestSuite()
suite.addTests(MyTest(testcasea))

addTests():addTest()方法是將多個測試用例添加到測試套件中,參數是可叠代對象,如下方,是將本模塊下的MyTest類下的testcasea、testcaseA測試用例添加到測試套件中。

suite=unittest.TestSuite()
suite.addTests([MyTest(testcasea),MyTest(testcaseA)])

4、TextTextRunner的屬性

run():run方法是運行測試套件的測試用例,參數是suite測試套件。

三、示例

import unittest
#定義要校驗的函數,函數的功能是傳遞兩個參數,做兩個參數的除法計算
def division(a,b):
    try:
        return round(a/b,1)
    except Exception as e:
        return 不可計算


#定義測試類,繼承unittest.TestCase類
#可以繼承unittest.TestCase類的setUp方法和tearDown方法
#可以繼承unittest.TestCase類的各種斷言方法
class MyTest(unittest.TestCase):

    ##定義tearDown()做每一個測試用例執行前的初始化工作
    def setUp(self):
        print(開始測試)

#定義測試用例:以“test_”開頭命名的方法
#註意,方法的入參為self
#可使用unittest.TestCase類下面的各種斷言方法用於對測試結果的判斷
#可定義多個測試用例

    def testcasea(self):
        print(testcasea)
        res=division(1,2)
        self.assertEqual(res,0.5,算錯)

    def testcaseA(self):
        print(testcaseA)
        res = division(1, 0)
        self.assertEqual(res,不可計算, 算錯)

    @unittest.skip(暫時跳過測試用例3)
    def testcaseB(self):
        res = division(1, -2)
        self.assertEqual(res,-0.5, 算錯)

    #定義tearDown()做每一個測試用例執行完畢的善後工作
    def tearDown(self):
        print(測試用例執行完畢)

#執行測試用例方案1
#main方法會搜索該模塊下所有以test開頭的測試用例方法,並自動執行它們。
#執行順序是根據測試用例(方法)的名稱的ASCII碼順序
unittest.main()


#執行測試用例方法2:
#先構造測試集
#實例化測試套件
suite=unittest.TestSuite()
#添加測試用例到測試套件中
#測試用例的執行順序是根據添加測試用例的順序,
#如下,會先執行testcasea,再執行testcaseA、再執行testcaseB
suite.addTests([MyTest(testcasea),MyTest(testcaseA),MyTest(testcaseB)])


#執行測試用例,實例化TextTestRunner類
#調用run方法,運行測試套件
#執行時,也會根據裝飾器判斷是否執行或者屏蔽測試用例
runner=unittest.TextTestRunner()
runner.run(suite)

# 執行測試用例方案三
#使用defaultTestLoader類的discover()方法自動到指定目錄下匹配查找測試用例文件
#並自動將找到的測試用例組裝到測試套件中

#定義查找目錄
test_dir=./
disco=unittest.defaultTestLoader.discover(test_dir,pattern=yaml1.py)
runner = unittest.TextTestRunner()
runner.run(disco)

執行方案1和3的運行結果如下:

可以看到先執行的testcaseA、在執行的testcasea,且沒有執行testcaseB

開始測試
testcaseA
測試用例執行完畢
開始測試
testcasea
測試用例執行完畢
.s.
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK (skipped=1)

執行方案2的運行結果如下:

可以看到先執行的testcasea、在執行的testcaseA,且testcaseB跳過不執行

開始測試
testcasea
測試用例執行完畢
開始測試
testcaseA
測試用例執行完畢
..s
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK (skipped=1)

參考網站:

https://www.cnblogs.com/yufeihlf/p/5707929.html

單元測試-unittest