Python札记 -- 测试优先
??? 竹風看的第一本有關Python的書是《Dive Into Python》(簡稱DIP),本人覺得這本書寫得是相當不錯的(當然竹風無意卷入關于這本書是好是壞的爭論,只要找到適合自己的資料和學習方式就好)。讀《DIP》的時候,竹風對HTML和XML是一竅不通(當然現(xiàn)在也只是會點基本的),所以這兩章是看得云里霧里的。當然也有給竹風帶來震撼的章節(jié),比如“單元測試”和“測試優(yōu)先編程”。
??? 《DIP》中給出了一個羅馬數(shù)字的程序例子,里面用到了Python中的unittest模塊,這段時間竹風看了下Python 2.7的文檔,結合自己的工作體會,做一個簡單總結,跟大家分享一下。當然,如果錯誤,是竹風學藝不精,歡迎大家的指正和討論^_^。
??? 參考資料:《Dive Into Python》??Mark Pilgrim? 第13章.單元測試??? 第14章.測試優(yōu)先編程 (強力推薦讀一下,里面測試驅(qū)動開發(fā)的思想很值得了解)
????????????????? 《ActivePython Documentation》? 這個是在windows上安裝 ActiveState ActivePython 2.7 附帶的
??? 一、簡單的例子
??? 竹風琢磨著,程序員最好的交流就是用代碼了,“翠花,上代碼~~”
1 #!/usr/bin/env python 2 #coding: utf-8 3 4 import random 5 import unittest #首先將 unittest 模塊導入 6 7 class TestSequenceFunctions(unittest.TestCase): #繼承了TestCase 8 9 def setUp(self): #初始化函數(shù),生成10個元素的列表 10 self.seq = range(10) 11 12 def test_shuffle(self): 13 #測試shuffled操作是否會丟失元素 14 random.shuffle(self.seq) 15 self.seq.sort() 16 self.assertEqual(self.seq, range(10)) #用到了一個判斷相等的斷言 17 18 #如果傳入一個不可變的對象,比如元組,應拋出一個異常 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) #用到了一個判斷值為真的斷言 25 26 def test_sample(self): 27 #測試sample操作返回的結果是否屬于seq 28 self.assertRaises( #當傳入的參數(shù)有誤時,應拋出一個異常 29 ValueError, random.sample, self.seq, 20 30 ) 31 for element in random.sample(self.seq, 5): 32 self.assertTrue(element in self.seq) #用到了一個判斷值為真的斷言 33 34 if __name__ == '__main__': 35 unittest.main()??? 竹風在文檔的例子上稍微加了點注釋,這個例子對各位園友來說應該是小菜一碟了。如果使用的是Python 2.7的話,還可以將28-30行修改為:
1 with self.assertRaises(ValueError): 2 random.sample(self.seq, 20)??? 運行起來應該是這個樣子的:???
1 $ python TestSequenceFuncions.py 2 ... 3 ---------------------------------------------------------------------- 4 Ran 3 tests in 0.000s 5 6 OK??? 如果想看稍微詳細點的測試信息,可以將最后一行 “unittest.main()” 修改如下:
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)unittest.TextTestRunner(verbosity=2).run(suite)??? 這時候輸出信息就會稍微詳細一點:
$ python TestSequenceFuncions.py test_choice (__main__.TestSequenceFunctions) ... ok test_sample (__main__.TestSequenceFunctions) ... ok test_shuffle (__main__.TestSequenceFunctions) ... ok---------------------------------------------------------------------- Ran 3 tests in 0.000sOK??? 如果還覺得不夠詳細,那么可以在命令行上加 -v 選項:
$ python -v TestSequenceFuncions.py不過這個輸出到屏幕的信息已經(jīng)達到刷屏的程度了。。。大家還是慎用。。。
??? 二、測試的順序與命名規(guī)范
??? 不知道各位園友注意到了沒有,測試的順序是跟class里面定義的def的順序無關的。
在class的定義順序是:(test_shuffle,test_choice,test_sample);
而實際測試的時候是:(test_choice,test_sample,test_shuffle);
根據(jù)竹風的個人經(jīng)驗,測試的順序應該是在去掉 “test_” 前綴后,按照字母順序排序。
??? 還需要提到的一點是,需要測試的 def 需要以 “test_” 為前綴。針對這點,我們可以寫一個 “make_test_data” 的函數(shù)準備測試數(shù)據(jù),再寫一個 “clean_test_data” 的函數(shù)清理測試數(shù)據(jù)。
??? PS:根據(jù)《DIP》里面提到關于測試的兩個基本原則:
??? 一、每個測試用例只回答一個問題。
??? 二、每個測試用例必須可以與其他測試用例隔離工作,每個測試用例是一個“孤島”。
根據(jù)這兩個基本原則,的確應該與定義他們的順序無關的。
??? 三、初始化(setUp)和清理工作(tearDown)
????如果竹風用“make_test_data”來創(chuàng)建測試數(shù)據(jù),竹風的基友用的是"create_test_data",一千個程序員可能就帶來一千種命名方式,這五花八門的函數(shù)名字可就真的讓人頭疼了。
??? 根據(jù)Python里“import this”的精神,應該會有專門的函數(shù)來執(zhí)行初始化或者清理工作的。也的確有這兩個函數(shù),setUp 與 tearDown 分別負責 初始化 和 清理 工作。
??? setUp函數(shù)總是第一個調(diào)用,而tearDown函數(shù)則總是在最后一個調(diào)用?,F(xiàn)在函數(shù)調(diào)用的順序也大概理清楚了:setUp --> test_* --> tearDown。
??? 四、常用的斷言方法(assert methods)
??? 最后水一下幾個常用的斷言。
??? assertEqual(first, second, msg=None)
??? assertNotEqual(first, second, msg=None)
??? 判斷first和second是否相等(不等),msg為測試失敗時給出的信息。msg一般使用默認值就行
??? assertTrue(expr, msg=None)
??? assertFalse(expr, msg=None)
??? 判斷expr的值是否為真(假),msg為測試失敗時給出的信息。
??? assertRaises(exception, callable, *args, **kwds)??? #參數(shù)魔法里面有提到過的哦
??? assertRaises(exception)
??? 判斷是否拋出一個異常,*args和 **kwds 為調(diào)用 callable 需要傳的參數(shù),注意這里callable的傳參數(shù)方式。可參照上面的例子。
??? 到這里竹風這個簡單的分享也結束了,用上面的這些內(nèi)容,寫個簡單的測試用例問題應該不大了。
??? 測試個人感覺上是一個很大的領域,竹風也只是剛接觸。
??? 建議有興趣的園友看一下《DIP》的13、14章,當然也可以看下Python的文檔。
??? 祝大家新年快樂,萬事如意^_^
?
轉(zhuǎn)載于:https://www.cnblogs.com/PandaBamboo/archive/2013/02/06/2907387.html
總結
以上是生活随笔為你收集整理的Python札记 -- 测试优先的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebAR+教育丨帮助老师课堂教学,教育
- 下一篇: python爱意满满_抖音ohbaby你