国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解Python的單元測試

詳解Python的單元測試

2020-06-15 09:56廖雪峰 Python

這篇文章主要介紹了Python的單元測試,代碼基于Python2.x版本,需要的朋友可以參考下

如果你聽說過“測試驅動開發”(TDD:Test-Driven Development),單元測試就不陌生。

單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。

比如對函數abs(),我們可以編寫出以下幾個測試用例:

  •     輸入正數,比如1、1.2、0.99,期待返回值與輸入相同;
  •     輸入負數,比如-1、-1.2、-0.99,期待返回值與輸入相反;
  •     輸入0,期待返回0;
  •     輸入非數值類型,比如None、[]、{},期待拋出TypeError。

把上面的測試用例放到一個測試模塊里,就是一個完整的單元測試。

如果單元測試通過,說明我們測試的這個函數能夠正常工作。如果單元測試不通過,要么函數有bug,要么測試條件輸入不正確,總之,需要修復使單元測試能夠通過。

單元測試通過后有什么意義呢?如果我們對abs()函數代碼做了修改,只需要再跑一遍單元測試,如果通過,說明我們的修改不會對abs()函數原有的行為造成影響,如果測試不通過,說明我們的修改與原有行為不一致,要么修改代碼,要么修改測試。

這種以測試為驅動的開發模式最大的好處就是確保一個程序模塊的行為符合我們設計的測試用例。在將來修改的時候,可以極大程度地保證該模塊行為仍然是正確的。

我們來編寫一個Dict類,這個類的行為和dict一致,但是可以通過屬性來訪問,用起來就像下面這樣:

?
1
2
3
4
5
>>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d.a
1

mydict.py代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class Dict(dict):
 
  def __init__(self, **kw):
    super(Dict, self).__init__(**kw)
 
  def __getattr__(self, key):
    try:
      return self[key]
    except KeyError:
      raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
 
  def __setattr__(self, key, value):
    self[key] = value

為了編寫單元測試,我們需要引入Python自帶的unittest模塊,編寫mydict_test.py如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import unittest
 
from mydict import Dict
 
class TestDict(unittest.TestCase):
 
  def test_init(self):
    d = Dict(a=1, b='test')
    self.assertEquals(d.a, 1)
    self.assertEquals(d.b, 'test')
    self.assertTrue(isinstance(d, dict))
 
  def test_key(self):
    d = Dict()
    d['key'] = 'value'
    self.assertEquals(d.key, 'value')
 
  def test_attr(self):
    d = Dict()
    d.key = 'value'
    self.assertTrue('key' in d)
    self.assertEquals(d['key'], 'value')
 
  def test_keyerror(self):
    d = Dict()
    with self.assertRaises(KeyError):
      value = d['empty']
 
  def test_attrerror(self):
    d = Dict()
    with self.assertRaises(AttributeError):
      value = d.empty

編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承。

以test開頭的方法就是測試方法,不以test開頭的方法不被認為是測試方法,測試的時候不會被執行。

對每一類測試都需要編寫一個test_xxx()方法。由于unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertEquals():

self.assertEquals(abs(-1), 1) # 斷言函數返回的結果與1相等

另一種重要的斷言就是期待拋出指定類型的Error,比如通過d['empty']訪問不存在的key時,斷言會拋出KeyError:

?
1
2
with self.assertRaises(KeyError):
  value = d['empty']

而通過d.empty訪問不存在的key時,我們期待拋出AttributeError:

?
1
2
with self.assertRaises(AttributeError):
  value = d.empty

運行單元測試

一旦編寫好單元測試,我們就可以運行單元測試。最簡單的運行方式是在mydict_test.py的最后加上兩行代碼:

?
1
2
if __name__ == '__main__':
  unittest.main()

這樣就可以把mydict_test.py當做正常的python腳本運行:

?
1
$ python mydict_test.py

另一種更常見的方法是在命令行通過參數-m unittest直接運行單元測試:

?
1
2
3
4
5
6
$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
 
OK

這是推薦的做法,因為這樣可以一次批量運行很多單元測試,并且,有很多工具可以自動來運行這些單元測試。
setUp與tearDown

可以在單元測試中編寫兩個特殊的setUp()和tearDown()方法。這兩個方法會分別在每調用一個測試方法的前后分別被執行。

setUp()和tearDown()方法有什么用呢?設想你的測試需要啟動一個數據庫,這時,就可以在setUp()方法中連接數據庫,在tearDown()方法中關閉數據庫,這樣,不必在每個測試方法中重復相同的代碼:

?
1
2
3
4
5
6
7
class TestDict(unittest.TestCase):
 
  def setUp(self):
    print 'setUp...'
 
  def tearDown(self):
    print 'tearDown...'

可以再次運行測試看看每個測試方法調用前后是否會打印出setUp...和tearDown...。
小結

單元測試可以有效地測試某個程序模塊的行為,是未來重構代碼的信心保證。

單元測試的測試用例要覆蓋常用的輸入組合、邊界條件和異常。

單元測試代碼要非常簡單,如果測試代碼太復雜,那么測試代碼本身就可能有bug。

單元測試通過了并不意味著程序就沒有bug了,但是不通過程序肯定有bug。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久丁香| 黄在线观看 | 日本末发育嫩小xxxx | 黄色国产大片 | 淫片免费观看 | 精品国产91久久 | 免费一级片视频 | 自由成熟xxxx色视频 | 在线精品国产 | 特污影院 | 中文字幕亚洲精品 | 日韩中文字幕视频在线 | 亚洲成人一区二区三区 | 精品美女在线观看 | 色在线免费观看 | 国产一区二区视频精品 | 国产精品视频一区二区三区不卡 | 一区二区免费在线视频 | 亚洲综合中文 | 99久久国产露脸国语对白 | 国产一区二区三区免费视频 | 日本一区二区精品 | 川上优av中文字幕一区二区 | 国产免费看| 日韩中文字幕在线免费观看 | 日韩视频网 | 国产精品美女久久久久久久网站 | 在线观看91视频 | 久久久夜夜夜 | 一区二区高清 | 欧美日韩亚洲一区二区 | 精品久久一区 | 精品欧美| 亚洲大奶网 | 91一区二区 | 日韩一区二区三区福利视频 | 欧美一区二区三区在线观看视频 | 日韩a视频 | 国产毛片18片毛一级特黄日韩a | 欧美日韩一区二区三区不卡视频 | 97久久久|