Python凡人筆記 -- 測試優(yōu)先竹風(fēng)看的第一本有關(guān)Python的書是《Dive Into Python》(簡稱DIP),本人覺得這本書寫得是相當(dāng)不錯(cuò)的(當(dāng)然竹風(fēng)無意卷入關(guān)于這本書是好是壞的爭論,只要找到適合自己的資料和學(xué)習(xí)方式就好)。讀《DIP》的時(shí)候,竹風(fēng)對(duì)HTML和XML是一竅不通(當(dāng)然現(xiàn)在也只是會(huì)點(diǎn)基本的),所以這兩章是看得云里霧里的。當(dāng)然也有給竹風(fēng)帶來震撼的章節(jié),比如“單元測試”和“測試優(yōu)先編程”。 《DIP》中給出了一個(gè)羅馬數(shù)字的程序例子,里面用到了Python中的unittest模塊,這段時(shí)間竹風(fēng)看了下Python 2.7的文檔,結(jié)合自己的工作體會(huì),做一個(gè)簡單總結(jié),跟大家分享一下。當(dāng)然,如果錯(cuò)誤,是竹風(fēng)學(xué)藝不精,歡迎大家的指正和討論^_^。 參考資料:《Dive Into Python》 Mark Pilgrim 第13章.單元測試 第14章.測試優(yōu)先編程 (強(qiáng)力推薦讀一下,里面測試驅(qū)動(dòng)開發(fā)的思想很值得了解) 一、簡單的例子 竹風(fēng)琢磨著,程序員最好的交流就是用代碼了,“翠花,上代碼~~” 1 #!/usr/bin/env python 2 #coding: utf-8 3 4 import random 5 import unittest #首先將 unittest 模塊導(dǎo)入 6 7 class TestSequenceFunctions(unittest.TestCase): #繼承了TestCase 8 9 def setUp(self): #初始化函數(shù),生成10個(gè)元素的列表 10 self.seq = range(10) 11 12 def test_shuffle(self): 13 #測試shuffled操作是否會(huì)丟失元素 14 random.shuffle(self.seq) 15 self.seq.sort() 16 self.assertEqual(self.seq, range(10)) #用到了一個(gè)判斷相等的斷言 17 18 #如果傳入一個(gè)不可變的對(duì)象,比如元組,應(yīng)拋出一個(gè)異常 19 self.assertRaises(TypeError, random.shuffle, (1,2,3)) 20 21 def test_choice(self): 22 #測試choice操作返回的值是否屬于seq 23 element = random.choice(self.seq) 24 self.assertTrue(element in self.seq) #用到了一個(gè)判斷值為真的斷言 25 26 def test_sample(self): 27 #測試sample操作返回的結(jié)果是否屬于seq 28 self.assertRaises( #當(dāng)傳入的參數(shù)有誤時(shí),應(yīng)拋出一個(gè)異常 29 ValueError, random.sample, self.seq, 20 30 ) 31 for element in random.sample(self.seq, 5): 32 self.assertTrue(element in self.seq) #用到了一個(gè)判斷值為真的斷言 33 34 if __name__ == '__main__': 35 unittest.main() 竹風(fēng)在文檔的例子上稍微加了點(diǎn)注釋,這個(gè)例子對(duì)各位園友來說應(yīng)該是小菜一碟了。如果使用的是Python 2.7的話,還可以將28-30行修改為: 1 with self.assertRaises(ValueError): 2 random.sample(self.seq, 20) 運(yùn)行起來應(yīng)該是這個(gè)樣子的: 1 $ python TestSequenceFuncions.py 2 ... 3 ---------------------------------------------------------------------- 4 Ran 3 tests in 0.000s 5 6 OK 如果想看稍微詳細(xì)點(diǎn)的測試信息,可以將最后一行 “unittest.main()” 修改如下: suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
unittest.TextTestRunner(verbosity=2).run(suite)這時(shí)候輸出信息就會(huì)稍微詳細(xì)一點(diǎn): $ python TestSequenceFuncions.py test_choice (__main__.TestSequenceFunctions) ... ok test_sample (__main__.TestSequenceFunctions) ... ok test_shuffle (__main__.TestSequenceFunctions) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK 如果還覺得不夠詳細(xì),那么可以在命令行上加 -v 選項(xiàng): $ python -v TestSequenceFuncions.py 不過這個(gè)輸出到屏幕的信息已經(jīng)達(dá)到刷屏的程度了。。。大家還是慎用。。。
不知道各位園友注意到了沒有,測試的順序是跟class里面定義的def的順序無關(guān)的。 三、初始化(setUp)和清理工作(tearDown) 如果竹風(fēng)用“make_test_data”來創(chuàng)建測試數(shù)據(jù),竹風(fēng)的基友用的是"create_test_data",一千個(gè)程序員可能就帶來一千種命名方式,這五花八門的函數(shù)名字可就真的讓人頭疼了。 四、常用的斷言方法(assert methods) 最后水一下幾個(gè)常用的斷言。
到這里竹風(fēng)這個(gè)簡單的分享也結(jié)束了,用上面的這些內(nèi)容,寫個(gè)簡單的測試用例問題應(yīng)該不大了。
|
|
|