當前位置:
首頁 > 最新 > 說說Python中的單元測試

說說Python中的單元測試

單元測試是每種編程語言必學的課題,是保護開發者的強力護盾,每個程序員都在時間允許的情況下儘可能多的寫單元測試,今天我們不討論其必要性,只當拋磚引玉隨便聊一聊Python中單元測試,本文僅代表個人看法。


標準庫中難以忍受的 unittest

很多時候我們總是認為標準庫里的帶的總是精挑細選的,如果不經過仔細打磨怎麼可能入選為一等公民?但我要告訴你,Python標準庫里的單元測試框架真不是最好的,隨著你對Python的熟悉你甚至會討厭這個unittest。

Python一直崇尚簡單,優雅,高效地完成事情,當你寫完一個函數需要測試一下時,使用標準庫的unittest你需要做這些事情:

新建單元測試腳本

導入單元測試依賴

繼承單元測試類

實現單元測試方法

具體的實例代碼如下:

看上去還行,不是很難。但是漸漸地你會吐槽:

為啥我要新建一個文件來寫測試?

為啥我要繼承一個類來寫測試?

為啥我要用unittest的Assertion來做斷言?

為啥unitunit的命名規則跟最佳實踐不一樣( vs )?

要回答以上問題,答案只有一個:歷史原因。

- https://www.quora.com/Will-Pythons-unittest-module-become-pythonic-anytime-soon

很久很久以前,Python從Java借鑒了單元測試框架,包括命名規則和實現方式,一直沿用至今。不得不說這個框架沒啥毛病,該有的功能的都有,想做的事都可以做,但是用起來總是沒有爽的感覺,因為太多束縛了。

但是為啥偉大的社區力量為啥不把這個框架改的爽一點呢?沒辦法,我估計是為了世界和平,你要知道Python這個龐然大物能健康地活著,後面有無數的類庫和方法在支撐,而這些類庫和方法都被單元測試保護著,如果修改了單元測試框架導致兼容性問題,就成了千古罪人。


Python中很多大牛其實都有嚴重的強迫症,追求簡潔和優雅的代碼。必然的,他們會拋棄標準庫中的unittest,使用或者發明自己心儀的單元測試框架。

正如其名,pytest是一個無數人推薦並在使用的Python單元測試框架,它使用起來非常簡單,只要你的方法名以 開頭就可以,你可以和需要測試的方法放在一起,亦或是新建一個文件來專門存放單元測試,都可以。

這樣的設計,就讓你寫單元測試成了順手拈來的事,假如你寫完了一個方法,想看看是否work,在旁邊直接寫上一個 開頭的方法,稍微準備一下數據就可以驗證這個方法好不好用,豈不妙哉?

The idioms that pytest first introduced brought a change in the Python community because they made it possible for test suites to be written in a very compact style, or at least far more compact than was ever possible before. Pytest basically introduced the concept that Python tests should be plain Python functions instead of forcing developers to include their tests inside large test classes.

pytest 的發明讓大家意識到單元測試原來可以這麼輕鬆和隨意,完全沒有必要去繼承一個所謂的測試類或者按照複雜的規則才能開始書寫測試代碼,這也是我選擇和推薦它的理由。

當然,如果原來你的單元測試時unittest寫的話,pytest其實也是有可能兼容的的。

pytest 能夠識別 子類中的測試方法,如果文件名符合 或者 這樣的規則。

並且大多數 的功能都是被支持的,例如:

裝飾器;

;

;

我覺得,pytest有以下優點:

上手和使用足夠簡單

當case失敗時信息足夠豐富和直觀,比如最後導致失敗的變數值會列印出來

更豐富的運行參數

可以使用 而不是

被廣大IDE支持,社區資源豐富,用戶群體大


畢竟我們大多數人都不是神,不能用記事本寫代碼,IDE才是我們正確搬磚的方式。Python的首選IDE毋庸置疑就是 JetBrain 公司出品的 PyCharm。

在PyCharm中只要你將默認的單元測試驅動改成pytest,就可以在任意 開頭的方法上通過右鍵菜單運行或者調試這個測試案例,非常方便。

更改PyCharm設置

右鍵菜單運行或者調試

如果你要運行當前文件的所有測試,只要從非 方法的其他區域點擊右鍵即可。或者修改任意已經運行過的Configuration,添加你想要的參數,比如最多運行掛3個case就終止測試等等。

自定義Run Configuration

單元測試的重要性大家都知道,大名鼎鼎的TDD應該都聽過,但是真正在實踐的少之又少。

究其原因,一些人會說時間寫代碼都不夠,哪還有空寫單元測試。還有一些人就是嫌麻煩,在絕大多數編程語言里單元測試都是需要單獨建立工程和目錄的,寫單元測試需要很多基礎工作要做,本以為順手就可以寫的單元測試,實際上需要費九牛二虎之力還是在搭架子,很容易讓人沮喪。

Python的動態特性和靈活性讓它有可能讓單元測試超級簡單,有可能你認為單元測試還是不要和業務代碼混合在一起的好,那就多辛苦一點新建一個文件導入要測試的方法,寫一個 開頭的方法即可,不算太難,不要找推辭的理由。

最後我個人觀點,單元測試其實還有一個非常重要的作用,就是替代函數文檔注釋。比如你寫了一個函數,使用起來可能有那麼一點複雜,你可以給它寫一份清晰的注釋文檔,但是千言萬語不如給我來個例子,單元測試可以充當例子的角色,什麼樣的輸入,輸出結果如何,一目了然。

希望從今天起,你的代碼也都有單元測試。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python和Scala的定義變數
Python 2與Python 3 的區別

TAG:Python |