利用Python中unittest實(shí)現(xiàn)簡單的單元測試實(shí)例詳解
前言
單元測試的重要性就不多說了,可惡的是Python中有太多的單元測試框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nose, mox, mock, fixtures, discover,再加上setuptools, distutils等等這些,先不說如何寫單元測試,光是怎么運(yùn)行單元測試就有N多種方法,再因?yàn)樗菧y試而非功能,是很多人沒興趣觸及的東西。但是作為一個(gè)優(yōu)秀的程序員,不僅要寫好功能代碼,寫好測試代碼一樣的彰顯你的實(shí)力。如此多的框架和工具,很容易讓人困惑,困惑的原因是因?yàn)椴]有理解它的基本原理,如果一些基本的概念都不清楚,怎么能夠?qū)懗鏊悸非逦臏y試代碼?
今天的主題就是unittest,作為標(biāo)準(zhǔn)python中的一個(gè)模塊,是其它框架和工具的基礎(chǔ),參考資料是它的官方文檔:http://docs.python.org/2.7/library/unittest.html和源代碼,文檔已經(jīng)寫的非常好了,本文給出一個(gè)實(shí)例,很簡單,看一下就明白了。
實(shí)例如下
首先給出一個(gè)要測試的Python模塊,代碼如下:
待測試的程序:date_service.pyPython
# coding:utf8 ''' 日期常用類 @author: www.crazyant.net ''' def get_date_year_month(pm_date): """獲取參數(shù)pm_date對(duì)應(yīng)的年份和月份 """ if not pm_date: raise Exception("get_curr_year_month: pm_date can not be None") # get date's yyyymmddHHMMSS pattern str_date = str(pm_date).replace("-", "").replace(" ", "").replace(":", "") year = str_date[:4] month = str_date[4:6] return year, month
然后就可以編寫測試腳本,代碼如下:
測試程序:test_date_service.pyPython
# coding: utf8 """ 測試date_service.py @author: peishuaishuai """ import unittest from service import date_service class DateServiceTest(unittest.TestCase): """ test clean_tb_async_src_acct.py """ def setup(self): """在這里做資源的初始化 """ pass def tearDown(self): """在這里做資源的釋放 """ pass def test_get_date_year_month_1(self): """ 測試方法1,測試方法應(yīng)該以test_開頭 """ pm_date = "2015-11-25 14:40:52" year, month = date_service.get_date_year_month(pm_date) self.assertEqual(year, "2015", "year not equal") self.assertEqual(month, "11", "month not equal") def test_get_date_year_month_2(self): """ 測試方法1,測試方法應(yīng)該以test_開頭 """ pm_date = "20161225144052" year, month = date_service.get_date_year_month(pm_date) self.assertEqual(year, "2016", "year not equal") self.assertEqual(month, "12", "month not equal") # test main if __name__ == "__main__": unittest.main()
運(yùn)行這個(gè)test_date_service.py,就會(huì)打印出如下信息:
運(yùn)行測試結(jié)果
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
這里的每一個(gè)點(diǎn),就代表運(yùn)行成功了一個(gè)測試,最后會(huì)給出運(yùn)行成功了全部的多少個(gè)測試以及測試的時(shí)間。
之前的很多時(shí)間,我一直不知道寫單測有什么用,因?yàn)閱螠y只是把寫好的程序運(yùn)行了一遍,并沒有創(chuàng)建新的邏輯,我心里在疑惑“我已經(jīng)將程序按照我的想法寫好了,它就會(huì)按照我的設(shè)計(jì)來運(yùn)行,為什么要用單測重新走一遍呢?”,后來出了一個(gè)事情,代碼出了BUG,我調(diào)試了好久,才發(fā)現(xiàn)問題出在”obja.equals(objb)”,因?yàn)閛bja和objb一個(gè)是Long一個(gè)是Integer,所以即使數(shù)值相同,也不會(huì)相等。
從那一刻,我發(fā)現(xiàn)單測做的事情,其實(shí)就是“驗(yàn)證程序是否按照我的想法在運(yùn)行”,這才是它的終極目的,但是,這卻是很關(guān)鍵的事情,設(shè)計(jì)往往沒有錯(cuò),但是寫出來的代碼卻經(jīng)常并不是按照我們所想的去運(yùn)行的。
單測,就是驗(yàn)證代碼是不是按照我們想象的在運(yùn)行,這也是單測這個(gè)技術(shù)的意義所在。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
用python寫一個(gè)帶有g(shù)ui界面的密碼生成器
這篇文章主要介紹了用python寫一個(gè)帶有g(shù)ui界面的密碼生成器,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11淺談Pycharm中的Python Console與Terminal
今天小編就為大家分享一篇淺談Pycharm中的Python Console與Terminal,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01python神經(jīng)網(wǎng)絡(luò)MobileNetV3?small模型的復(fù)現(xiàn)詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)MobileNetV3?small模型的復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05java中兩個(gè)byte數(shù)組實(shí)現(xiàn)合并的示例
今天小編就為大家分享一篇java中兩個(gè)byte數(shù)組實(shí)現(xiàn)合并的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Pandas中常用的七個(gè)時(shí)間戳處理函數(shù)使用總結(jié)
在零售、經(jīng)濟(jì)和金融等行業(yè),數(shù)據(jù)總是由于貨幣和銷售而不斷變化,生成的所有數(shù)據(jù)都高度依賴于時(shí)間。如果這些數(shù)據(jù)沒有時(shí)間戳或標(biāo)記,實(shí)際上很難管理所有收集的數(shù)據(jù)。本文為大家準(zhǔn)備了Pandas中常用的七個(gè)時(shí)間戳處理函數(shù),需要的可以參考一下2022-04-04Python報(bào)錯(cuò):OSError:?[Errno?22]?Invalid?argument解決方案及應(yīng)用實(shí)例
最近跑別人的項(xiàng)目遇到一個(gè)這樣的問題一開始以為是沒有用管理員的權(quán)限運(yùn)行,導(dǎo)致創(chuàng)建不了日志文件后來發(fā)現(xiàn)是和windows的命名規(guī)則沖突了,這篇文章主要給大家介紹了關(guān)于Python報(bào)錯(cuò):OSError:?[Errno?22]?Invalid?argument的解決方案及應(yīng)用實(shí)例,需要的朋友可以參考下2024-07-07Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法
今天小編就為大家分享一篇Python任意字符串轉(zhuǎn)16, 32, 64進(jìn)制的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實(shí)現(xiàn)
這篇文章主要介紹了opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03