一個單元測試樣例的規(guī)則
- 完全自動運行,而不需要人工干預(yù)。單元測試幾乎是全自動的。
- 自主判斷被測試的方法是通過還是失敗,而不需要人工解釋結(jié)果。
- 獨立運行,而不依賴其它測試用例(即使測試的是同樣的方法)。即,每一個測試用例都是一個孤島。
- 每一個獨立的測試都有它自己的不含參數(shù)及沒有返回值的方法。如果方法不拋出異常而正常退出則認為測試通過;否則,測試失敗。
測試文件的位置及命名規(guī)則
- 為了編寫測試用例,首先使該測試用例類成為unittest 模塊的TestCase 類的子類。TestCase 提供了很多你可以用于測試特定條件的測試用例的有用的方法。
- 所有測試樣例放在項目根目錄下的 test 文件夾中,如果你的所有測試都在一個文件中,也可以省略文件夾,直接把這個文件放在根目錄下,命名為
test_your_project.py(例如test_requests.py)。 - 如前一個測試用例,創(chuàng)建一個繼承于 unittest.TestCase 的類。你可以在每個類中實現(xiàn)多個測試(正如你在本節(jié)中將會看到的一樣),但是我卻選擇了創(chuàng)建一個新類,因為該測試與上一個有點不同。這樣,我們可以把正常輸入的測試跟非法輸入的測試分別放入不同的兩個類中。
- 測試本身是類一個方法,并且該方法以 test 開頭命名。
- 當(dāng)你改變條件的時候,要確保同步更新那些提示錯誤信息的可讀字符串。unittest 框架并不關(guān)心這些,但是如果你的代碼拋出描述不正確的異常信息的話會使得手工調(diào)試代碼變得困難。
- 出現(xiàn)頻率較多和不明朗的方法,需要加注釋,比如
test_string如果不加注釋很難讓人讀懂測試的是哪一個 string。
我們以bottle的測試為例:
import unittest
from tools import warn
from bottle import MakoTemplate, mako_template, mako_view, touni
class TestMakoTemplate(unittest.TestCase):
def test_string(self):
""" Templates: Mako string"""
t = MakoTemplate('start ${var} end').render(var='var')
self.assertEqual('start var end', t)
def test_file(self):
""" Templates: Mako file"""
t = MakoTemplate(name='./views/mako_simple.tpl').render(var='var')
self.assertEqual('start var end\n', t)