單元測試

測試驅(qū)動開發(fā)(TDD: Test-Driven Development)

在編寫某個(gè)功能的代碼之前先編寫測試代碼,然后只編寫使測試通過的功能代碼,通過測試來推動整個(gè)開發(fā)的進(jìn)行


unittest

  • 編寫單元測試時(shí),我們需要編寫一個(gè)測試類,從unittest.TestCase繼承
  • test開頭的方法就是測試方法,不以test開頭的方法不被認(rèn)為是測試方法,測試的時(shí)候不會被執(zhí)行
  • 對每一類測試都需要編寫一個(gè)test_xxx()方法

示例

demo.py文件中編寫一個(gè)如下實(shí)現(xiàn)除法功能的函數(shù)

def division(num1, num2):
    return num1 / num2

為這個(gè)函數(shù)編寫單元測試

# 引入模塊
import unittest


# 功能模塊
def division(num1, num2):
    return num1 / num2


# 測試類繼承 unittest.TestCase
class TestDivision(unittest.TestCase):
    
    # 結(jié)果斷言
    def test_division(self):
        res = division(1, 2)
        self.assertEqual(res, 0.5)
    
    # 異常斷言
    def test_err(self):
        with self.assertRaises(ZeroDivisionError):
            res = division(1, 0)


if __name__ == '__main__':
    unittest.main()
    

運(yùn)行

python demo.py 

結(jié)果,單元測試通過

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

代碼中如果沒寫

if __name__ == '__main__':
    unittest.main()

也可以運(yùn)行時(shí)通過傳參 -m unittest 來運(yùn)行單元測試:

python -m unittest demo.py

IDE中可右鍵直接運(yùn)行

Mock

如果有些功能調(diào)試過程中需要依賴外部數(shù)據(jù)怎么辦,舉個(gè)例子來說:我們有一個(gè)簡單的客戶端實(shí)現(xiàn),用來訪問一個(gè)URL,當(dāng)訪問正常時(shí),需要返回狀態(tài)碼200,不正常時(shí),需要返回狀態(tài)碼404

Mock是Python中一個(gè)用于支持單元測試的庫,它的主要功能是使用mock對象替代掉指定的Python對象,以達(dá)到模擬對象的行為

首先,我們在 client.py 中編寫如下客戶端代碼:

import requests


def send_request(url):
    r = requests.get(url)
    return r.status_code


def visit_ustack():
    return send_request('http://www.ustack.com')

外部模塊調(diào)用visit_ustack()來訪問UnitedStack的官網(wǎng)。下面我們使用mock對象在單元測試中分別測試訪問正常和訪問不正常的情況。

import unittest
from unittest import mock
import client


class TestClient(unittest.TestCase):

    def test_success_request(self):
        success_send = mock.Mock(return_value='200')
        client.send_request = success_send
        self.assertEqual(client.visit_ustack(), '200')

    def test_fail_request(self):
        fail_send = mock.Mock(return_value='404')
        client.send_request = fail_send
        self.assertEqual(client.visit_ustack(), '404')


if __name__ == '__main__':
    unittest.main()

大功告成

調(diào)試

  • print
  • assert
  • logging
  • pdb/ipdb

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容