6.python unittest

unittest中最核心的四個(gè)概念是:
test case, test suite, test runner, test fixture色解。
(1)一個(gè)TestCase的實(shí)例就是一個(gè)測(cè)試用例。什么是測(cè)試用例呢?就是一個(gè)完整的測(cè)試流程,包括測(cè)試前準(zhǔn)備環(huán)境的搭建(setUp),執(zhí)行測(cè)試代碼(run),以及測(cè)試后環(huán)境的還原(tearDown)歌径。元測(cè)試(unit test)的本質(zhì)也就在這里,一個(gè)測(cè)試用例是一個(gè)完整的測(cè)試單元亲茅,通過運(yùn)行這個(gè)測(cè)試單元回铛,可以對(duì)某一個(gè)問題進(jìn)行驗(yàn)證。
(2)而多個(gè)測(cè)試用例集合在一起克锣,就是TestSuite勺届,而且TestSuite也可以嵌套TestSuite。
(3)TestLoader是用來加載TestCase到TestSuite中的娶耍,其中有幾個(gè)loadTestsFrom__()方法,就是從各個(gè)地方尋找TestCase饼酿,創(chuàng)建它們的實(shí)例榕酒,然后add到TestSuite中,再返回一個(gè)TestSuite實(shí)例故俐。
(4)TextTestRunner是來執(zhí)行測(cè)試用例的想鹰,其中的run(test)會(huì)執(zhí)行TestSuite/TestCase中的run(result)方法。
測(cè)試的結(jié)果會(huì)保存到TextTestResult實(shí)例中药版,包括運(yùn)行了多少測(cè)試用例辑舷,成功了多少,失敗了多少等信息槽片。
(5)而對(duì)一個(gè)測(cè)試用例環(huán)境的搭建和銷毀何缓,是一個(gè)fixture肢础。

1.基本案例

test_mathfunc.py

# -*- coding:utf-8 -*-
import unittest
from mathfunc import *
'''
mathfunc.py
def add(a, b):
    return a+b

def minus(a, b):
    return a-b

def multi(a, b):
    return a*b

def divide(a, b):
    return a/b
'''

# 創(chuàng)建測(cè)試類
class TestMathFunc(unittest.TestCase):
    """ 用于測(cè)試mathfunc.py """
    def test_add(self):
        # add(a, b) 測(cè)試
        self.assertEqual(6, add(2, 4))  # 判斷6 與 add(2,4)的結(jié)果是否一致
        self.assertNotEqual(3, add(2, 2))  # 判斷3 與add(2,2)結(jié)果是否不一致

    def test_minus(self):
        # minus(a, b)測(cè)試
        self.assertEqual(3, minus(9, 6))  # 判斷3 與 minus(9,6))的結(jié)果是否一致

    def test_multi(self):
        # multi(a, b)測(cè)試
        self.assertEqual(6, multi(2, 3))   # 判斷6 與 minus(2,3))的結(jié)果是否一致

    def test_divide(self):
        # divide(a, b) 測(cè)試
        self.assertEqual(3, divide(6, 2))  # 判斷3 與 minus(6,2))的結(jié)果是否一致
        self.assertEqual(2.5, divide(5, 2))  # 判斷2.5 與 minus(5,2))的結(jié)果是否一致

if __name__ == '__main__':
    unittest.main()   # 執(zhí)行測(cè)試
image.png

2.TestSuite案例

按照順序執(zhí)行測(cè)試用例,并將測(cè)試結(jié)果輸出到指定文件
test_suite.py

# -*- coding:utf-8 -*-
import unittest
from unit_pro import TestMathFunc

if __name__ == '__main__':
    suite = unittest.TestSuite()  # 創(chuàng)建測(cè)試集合
    tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")] # 測(cè)試函數(shù)列表
    suite.addTests(tests) # 將測(cè)試函數(shù)列表添加到測(cè)試集合中

    # 控制臺(tái)輸出測(cè)試結(jié)果
    # runner = unittest.TextTestRunner(verbosity=2)
    # verbosity=0 只顯示執(zhí)行的用例的總數(shù)和全局的執(zhí)行結(jié)果碌廓。
    # verbosity=1 默認(rèn)值传轰,顯示執(zhí)行的用例的總數(shù)和全局的執(zhí)行結(jié)果,并對(duì)每個(gè)用例的執(zhí)行結(jié)果(成功T或失敗F)有個(gè)標(biāo)注谷婆。
    # verbosity=2 顯示執(zhí)行的用例的總數(shù)和全局的執(zhí)行結(jié)果慨蛙,并輸出每個(gè)用例的詳細(xì)的執(zhí)行結(jié)果。

    # runner.run(suite)  # 運(yùn)行單元測(cè)試


    # 將測(cè)試結(jié)果輸出到文件
    with open('unit_test_report.txt','a') as f:
        runner = unittest.TextTestRunner(stream=f, verbosity=2)
        runner.run(suite)

3.測(cè)試前后的環(huán)境準(zhǔn)備和清理

setUp用來為測(cè)試準(zhǔn)備環(huán)境纪挎,tearDown用來清理環(huán)境 注意:每次執(zhí)行case前后都執(zhí)行了一次
setUpClass期贫,tearDownClass在整個(gè)測(cè)試中只執(zhí)行一次
案例

# -*- coding:utf-8 -*-
import unittest
from mathfunc import *

'''
mathfunc.py
def add(a, b):
    return a+b

def minus(a, b):
    return a-b

def multi(a, b):
    return a*b

def divide(a, b):
    return a/b
'''

# 創(chuàng)建測(cè)試類
class TestMathFunc(unittest.TestCase):
    """ 用于測(cè)試mathfunc.py """
    # setUp用來為測(cè)試準(zhǔn)備環(huán)境,tearDown用來清理環(huán)境 注意:每次執(zhí)行case前后都執(zhí)行了一次
    # def setUp(self):
    #     print('執(zhí)行測(cè)試之前异袄,先準(zhǔn)備好環(huán)境 test.Prepare environment')
    #
    # def tearDown(self):
    #     print('執(zhí)行完成后的清理 test.Clean up')

    @classmethod
    def setUpClass(cls):
        print('測(cè)試中通砍,只在開始時(shí)被調(diào)用一次')

    @classmethod
    def tearDownClass(cls):
        print('測(cè)試中,只在結(jié)束時(shí)被調(diào)用一次')



    def test_add(self):
        # add(a, b) 測(cè)試
        self.assertEqual(6, add(2, 4))  # 判斷6 與 add(2,4)的結(jié)果是否一致
        self.assertNotEqual(3, add(2, 2))  # 判斷3 與add(2,2)結(jié)果是否不一致

    def test_minus(self):
        # minus(a, b)測(cè)試
        self.assertEqual(3, minus(9, 6))  # 判斷3 與 minus(9,6))的結(jié)果是否一致

    def test_multi(self):
        # multi(a, b)測(cè)試
        self.assertEqual(6, multi(2, 3))   # 判斷6 與 minus(2,3))的結(jié)果是否一致

    def test_divide(self):
        # divide(a, b) 測(cè)試
        self.assertEqual(3, divide(6, 2))  # 判斷3 與 minus(6,2))的結(jié)果是否一致
        self.assertEqual(2.5, divide(5, 2))  # 判斷2.5 與 minus(5,2))的結(jié)果是否一致

if __name__ == '__main__':
    unittest.main()   # 執(zhí)行測(cè)試

4.跳過某個(gè)case(實(shí)例)

skip無條件跳過隙轻,skipIf當(dāng)condition為True時(shí)跳過埠帕,skipUnless當(dāng)condition為False時(shí)跳過。

 @unittest.skip("我要跳過這個(gè)測(cè)試實(shí)例")  # 跳過該實(shí)例
    def test_divide(self):
        # divide(a, b) 測(cè)試
        self.assertEqual(3, divide(6, 2))  # 判斷3 與 minus(6,2))的結(jié)果是否一致
        self.assertEqual(2.5, divide(5, 2))  # 判斷2.5 與 minus(5,2))的結(jié)果是否一致
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玖绿,一起剝皮案震驚了整個(gè)濱河市敛瓷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斑匪,老刑警劉巖呐籽,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚀瘸,居然都是意外死亡狡蝶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門贮勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贪惹,“玉大人,你說我怎么就攤上這事寂嘉∽嗨玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵泉孩,是天一觀的道長硼端。 經(jīng)常有香客問我,道長寓搬,這世上最難降的妖魔是什么珍昨? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上镣典,老公的妹妹穿的比我還像新娘兔毙。我一直安慰自己,他們只是感情好骆撇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布瞒御。 她就那樣靜靜地躺著,像睡著了一般神郊。 火紅的嫁衣襯著肌膚如雪肴裙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天涌乳,我揣著相機(jī)與錄音蜻懦,去河邊找鬼。 笑死夕晓,一個(gè)胖子當(dāng)著我的面吹牛宛乃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸辆,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼征炼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了躬贡?” 一聲冷哼從身側(cè)響起谆奥,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拂玻,沒想到半個(gè)月后酸些,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檐蚜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年魄懂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯第。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡市栗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咳短,到底是詐尸還是另有隱情肃廓,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布诲泌,位于F島的核電站,受9級(jí)特大地震影響铣鹏,放射性物質(zhì)發(fā)生泄漏敷扫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葵第。 院中可真熱鬧绘迁,春花似錦、人聲如沸卒密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮奇。三九已至膛腐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼎俘,已是汗流浹背哲身。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贸伐,地道東北人勘天。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像捉邢,于是被迫代替她去往敵國和親脯丝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容