利用Python中unittest實(shí)現(xiàn)簡(jiǎn)單的單元測(cè)試實(shí)例詳解
前言
單元測(cè)試的重要性就不多說(shuō)了,可惡的是Python中有太多的單元測(cè)試框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nose, mox, mock, fixtures, discover,再加上setuptools, distutils等等這些,先不說(shuō)如何寫(xiě)單元測(cè)試,光是怎么運(yùn)行單元測(cè)試就有N多種方法,再因?yàn)樗菧y(cè)試而非功能,是很多人沒(méi)興趣觸及的東西。但是作為一個(gè)優(yōu)秀的程序員,不僅要寫(xiě)好功能代碼,寫(xiě)好測(cè)試代碼一樣的彰顯你的實(shí)力。如此多的框架和工具,很容易讓人困惑,困惑的原因是因?yàn)椴](méi)有理解它的基本原理,如果一些基本的概念都不清楚,怎么能夠?qū)懗鏊悸非逦臏y(cè)試代碼?
今天的主題就是unittest,作為標(biāo)準(zhǔn)python中的一個(gè)模塊,是其它框架和工具的基礎(chǔ),參考資料是它的官方文檔:http://docs.python.org/2.7/library/unittest.html和源代碼,文檔已經(jīng)寫(xiě)的非常好了,本文給出一個(gè)實(shí)例,很簡(jiǎn)單,看一下就明白了。
實(shí)例如下
首先給出一個(gè)要測(cè)試的Python模塊,代碼如下:
待測(cè)試的程序:date_service.pyPython
# coding:utf8
'''
日期常用類(lèi)
@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
然后就可以編寫(xiě)測(cè)試腳本,代碼如下:
測(cè)試程序:test_date_service.pyPython
# coding: utf8 """ 測(cè)試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): """ 測(cè)試方法1,測(cè)試方法應(yīng)該以test_開(kāi)頭 """ 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): """ 測(cè)試方法1,測(cè)試方法應(yīng)該以test_開(kāi)頭 """ 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)行測(cè)試結(jié)果
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
這里的每一個(gè)點(diǎn),就代表運(yùn)行成功了一個(gè)測(cè)試,最后會(huì)給出運(yùn)行成功了全部的多少個(gè)測(cè)試以及測(cè)試的時(shí)間。
之前的很多時(shí)間,我一直不知道寫(xiě)單測(cè)有什么用,因?yàn)閱螠y(cè)只是把寫(xiě)好的程序運(yùn)行了一遍,并沒(méi)有創(chuàng)建新的邏輯,我心里在疑惑“我已經(jīng)將程序按照我的想法寫(xiě)好了,它就會(huì)按照我的設(shè)計(jì)來(lái)運(yùn)行,為什么要用單測(cè)重新走一遍呢?”,后來(lái)出了一個(gè)事情,代碼出了BUG,我調(diào)試了好久,才發(fā)現(xiàn)問(wèn)題出在”obja.equals(objb)”,因?yàn)閛bja和objb一個(gè)是Long一個(gè)是Integer,所以即使數(shù)值相同,也不會(huì)相等。
從那一刻,我發(fā)現(xiàn)單測(cè)做的事情,其實(shí)就是“驗(yàn)證程序是否按照我的想法在運(yùn)行”,這才是它的終極目的,但是,這卻是很關(guān)鍵的事情,設(shè)計(jì)往往沒(méi)有錯(cuò),但是寫(xiě)出來(lái)的代碼卻經(jīng)常并不是按照我們所想的去運(yùn)行的。
單測(cè),就是驗(yàn)證代碼是不是按照我們想象的在運(yùn)行,這也是單測(cè)這個(gè)技術(shù)的意義所在。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- Python單元測(cè)試工具doctest和unittest使用解析
- Django使用unittest模塊進(jìn)行單元測(cè)試過(guò)程解析
- Python單元測(cè)試unittest的具體使用示例
- Python unittest單元測(cè)試框架總結(jié)
- Python unittest單元測(cè)試框架的使用
- 詳解python單元測(cè)試框架unittest
- unittest+coverage單元測(cè)試代碼覆蓋操作實(shí)例詳解
- Python Unittest自動(dòng)化單元測(cè)試框架詳解
- python單元測(cè)試unittest實(shí)例詳解
- 分享unittest單元測(cè)試框架中幾種常用的用例加載方法
相關(guān)文章
python中requests使用代理proxies方法介紹
這篇文章主要介紹了python中requests使用代理proxies方法介紹,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
python基于socket實(shí)現(xiàn)網(wǎng)絡(luò)廣播的方法
這篇文章主要介紹了python基于socket實(shí)現(xiàn)網(wǎng)絡(luò)廣播的方法,涉及Python操作socket的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Python線(xiàn)性網(wǎng)絡(luò)實(shí)現(xiàn)分類(lèi)糖尿病病例
什么是線(xiàn)性規(guī)劃?想象一下,您有一個(gè)線(xiàn)性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線(xiàn)性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對(duì)應(yīng)于某些其他線(xiàn)性函數(shù)的最大值或最小值2022-10-10
python 項(xiàng)目目錄結(jié)構(gòu)設(shè)置
JAVA有標(biāo)準(zhǔn)的maven目錄結(jié)構(gòu),golang也有建議的目錄結(jié)構(gòu),那么我想python是不是也有一個(gè)比較好的目錄結(jié)構(gòu)組織方式呢2020-02-02
用Python selenium實(shí)現(xiàn)淘寶搶單機(jī)器人
今天給大家?guī)?lái)的是關(guān)于Python實(shí)戰(zhàn)的相關(guān)知識(shí),文章圍繞著用Python selenium實(shí)現(xiàn)淘寶搶單機(jī)器人展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
基于wxPython的GUI實(shí)現(xiàn)輸入對(duì)話(huà)框(1)
這篇文章主要為大家詳細(xì)介紹了基于wxPython的GUI實(shí)現(xiàn)簡(jiǎn)單的輸入對(duì)話(huà)框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例
本文主要介紹了Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
python機(jī)器學(xué)習(xí)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)示例解析
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)python實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例解析,在同樣在進(jìn)行python機(jī)器學(xué)習(xí)的同學(xué)可以借鑒參考下,希望能夠有所幫助2021-10-10
如何在Python中利用matplotlib.pyplot畫(huà)出函數(shù)圖詳解
通過(guò)圖像可以直觀(guān)地學(xué)習(xí)函數(shù)變化、分布等規(guī)律,在學(xué)習(xí)函數(shù)、概率分布等方面效果顯著,下面這篇文章主要給大家介紹了關(guān)于如何在Python中利用matplotlib.pyplot畫(huà)出函數(shù)圖的相關(guān)資料,需要的朋友可以參考下2022-08-08

