什麼是python單元測試? (實例詳解)

乌拉乌拉~
發布: 2018-08-23 13:38:14
原創
2605 人瀏覽過

 在以下的文章之中我們來了解什麼是python中的單元測試。了解python單元測試的相關知識,以及python單元測試在python程式設計之中能起到什麼樣的作用。

單元測試

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

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

1.輸入正數,例如1、1.2、0.99,期待傳回值與輸入相同;

2.輸入負數,如-1、-1.2、-0.99,期待回傳值與輸入相反;

3.輸入0,期待回傳0;

4.輸入非數值類型,例如None、[]、{},期待拋出TypeError。

把上面的測試案例放到一個測試模組裡,就是一個完整的單元測試。

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

單元測試通過後又有什麼意義呢?如果我們對abs()函數程式碼做了修改,只需要再跑一次單元測試,如果通過,表示我們的修改不會對abs()函數原有的行為造成影響,如果測試不通過,說明我們的修改與原有行為不一致,要嘛修改程式碼,要嘛修改測試。

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

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

 >>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d.a
1
登入後複製

mydict.py程式碼如下:

class Dict(dict):
    def __init__(self, **kw):
        super().__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如下:

import unittest

from mydict import Dict
class TestDict(unittest.TestCase):
    def test_init(self):
        d = Dict(a=1, b='test')
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))
    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')
    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertTrue('key' in d)
        self.assertEqual(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提供了許多內建的條件判斷,我們只需要呼叫這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertEqual():

self.assertEqual(abs(-1), 1) # 断言函数返回的结果与1相等
登入後複製

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

with self.assertRaises(KeyError):
    value = d['empty']
登入後複製

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

with self.assertRaises(AttributeError):
    value = d.empty
登入後複製

##運行單元測試

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

if __name__ == '__main__':
    unittest.main()
登入後複製

这样就可以把mydict_test.py当做正常的python脚本运行:

$ python mydict_test.py
登入後複製

另一种方法是在命令行通过参数-m unittest直接运行单元测试:

$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
登入後複製

 这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。

以上就是本篇文章所讲述的所有内容,这篇文章主要介绍了python单元测试的相关知识,希望你能借助资料从而理解上述所说的内容。希望我在这片文章所讲述的内容能够对你有所帮助,让你学习python更加轻松。

更多相关知识,请访问php中文网Python教程栏目。

以上是什麼是python單元測試? (實例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板