測試驅(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)試
- assert
- logging
- pdb/ipdb