小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python凡人筆記

 昵稱QAb6ICvc 2013-02-20

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ā)的思想很值得了解)
                  《ActivePython Documentation》  這個(gè)是在windows上安裝 ActiveState ActivePython 2.7 附帶的

    一、簡單的例子

    竹風(fēng)琢磨著,程序員最好的交流就是用代碼了,“翠花,上代碼~~”

復(fù)制代碼
 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ù)制代碼

    竹風(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):

復(fù)制代碼
$ 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
復(fù)制代碼

    如果還覺得不夠詳細(xì),那么可以在命令行上加 -v 選項(xiàng):

$ python -v TestSequenceFuncions.py

不過這個(gè)輸出到屏幕的信息已經(jīng)達(dá)到刷屏的程度了。。。大家還是慎用。。。


    二、測試的順序與命名規(guī)范

    不知道各位園友注意到了沒有,測試的順序是跟class里面定義的def的順序無關(guān)的。
在class的定義順序是:(test_shuffle,test_choice,test_sample);
而實(shí)際測試的時(shí)候是:(test_choice,test_sample,test_shuffle);
根據(jù)竹風(fēng)的個(gè)人經(jīng)驗(yàn),測試的順序應(yīng)該是在去掉 “test_” 前綴后,按照字母順序排序。
    還需要提到的一點(diǎn)是,需要測試的 def 需要以 “test_” 為前綴。針對(duì)這點(diǎn),我們可以寫一個(gè) “make_test_data” 的函數(shù)準(zhǔn)備測試數(shù)據(jù),再寫一個(gè) “clean_test_data” 的函數(shù)清理測試數(shù)據(jù)。
    PS:根據(jù)《DIP》里面提到關(guān)于測試的兩個(gè)基本原則:
    一、每個(gè)測試用例只回答一個(gè)問題。
    二、每個(gè)測試用例必須可以與其他測試用例隔離工作,每個(gè)測試用例是一個(gè)“孤島”。
根據(jù)這兩個(gè)基本原則,的確應(yīng)該與定義他們的順序無關(guān)的

    三、初始化(setUp)和清理工作(tearDown

    如果竹風(fēng)用“make_test_data”來創(chuàng)建測試數(shù)據(jù),竹風(fēng)的基友用的是"create_test_data",一千個(gè)程序員可能就帶來一千種命名方式,這五花八門的函數(shù)名字可就真的讓人頭疼了。
    根據(jù)Python里“import this”的精神,應(yīng)該會(huì)有專門的函數(shù)來執(zhí)行初始化或者清理工作的。也的確有這兩個(gè)函數(shù),setUp 與 tearDown 分別負(fù)責(zé) 初始化 清理 工作。
    setUp函數(shù)總是第一個(gè)調(diào)用,而tearDown函數(shù)則總是在最后一個(gè)調(diào)用?,F(xiàn)在函數(shù)調(diào)用的順序也大概理清楚了:setUp --> test_* --> tearDown。

    四、常用的斷言方法(assert methods)

    最后水一下幾個(gè)常用的斷言。
    assertEqual(first, second, msg=None)
    assertNotEqual(first, second, msg=None)
    判斷first和second是否相等(不等),msg為測試失敗時(shí)給出的信息。msg一般使用默認(rèn)值就行


    assertTrue(expr, msg=None)
    assertFalse(expr, msg=None)
    判斷expr的值是否為真(假),msg為測試失敗時(shí)給出的信息。


    assertRaises(exception, callable, *args, **kwds)    #參數(shù)魔法里面有提到過的哦
    assertRaises(exception)
    判斷是否拋出一個(gè)異常,*args和 **kwds 為調(diào)用 callable 需要傳的參數(shù),注意這里callable的傳參數(shù)方式。可參照上面的例子。

    到這里竹風(fēng)這個(gè)簡單的分享也結(jié)束了,用上面的這些內(nèi)容,寫個(gè)簡單的測試用例問題應(yīng)該不大了。
    測試個(gè)人感覺上是一個(gè)很大的領(lǐng)域,竹風(fēng)也只是剛接觸。
    建議有興趣的園友看一下《DIP》的13、14章,當(dāng)然也可以看下Python的文檔。
    祝大家新年快樂,萬事如意^_^

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多