您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python如何單元測試,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
我們來說說目前幾個和測試有關的東西(全程 Python 3)。
Mock
Mock是個好東西呀,遇到測試中出現的不可預知的或者不穩定因素,就用 Mock 來代 替。例如查詢數據庫(當然像目前我們用的MongoDB,由于特別靈活,可以直接在代碼里 把相應的collection替換掉),例如異步任務等。舉個例子:
import logging from unittest.mock import Mock logging.basicConfig(level=logging.DEBUG) # code class ASpecificException(Exception): pass def foo(): pass def bar(): try: logging.info("enter function <foo> now") foo() except ASpecificException: logging.exception("we caught a specific exception") # unittest def test_foo(): foo = Mock(side_effect=ASpecificException()) # noqa logging.info("enter function <bar> now") bar() logging.info("everything just be fine") if __name__ == "__main__": test_foo()
運行一下
root@arch tests: python test_demo.py INFO:root:enter function <bar> now INFO:root:enter function <foo> now INFO:root:everything just be fine
一個簡單的測試就這么寫好了。來,跟我念,Mock 大法好呀!
doctest
doctest屬于比較簡單的測試,寫在 docstring 里,這樣既能測試用,又能當文檔 示例,是在是好用之極啊。缺點是,如果測試太復雜,doctest就顯得太臃腫了(例如 如果測試之前要導入一堆東西)。舉個例子:
import logging logging.basicConfig(level=logging.DEBUG) def foo(): """A utility function that returns True >>> foo() True """ return True if __name__ == "__main__": import doctest logging.debug("start of test...") doctest.testmod() logging.debug("end of test...")
測試結果
root@arch tests: python test_demo.py DEBUG:root:start of test... DEBUG:root:end of test...
unittest
這個文檔確實有點長,我感覺還是仔細去讀一下文檔比較好。
import unittest class TestStringMethods(unittest.TestCase): def setUp(self): self.alist = [] def tearDown(self): print(self.alist) def test_list(self): for i in range(5): self.alist.append(i) if __name__ == '__main__': unittest.main()
輸出結果
root@arch tests: python test_demo.py [0, 1, 2, 3, 4] . ---------------------------------------------------------------------- Ran 1 test in 0.001s
OK
unittest框架配合上Mock,單元測試基本無憂啦。
pytest
上面的單元測試跑起來比較麻煩,當然也可以寫一個腳本遍歷所有的單元測試文件,然 后執行。不過 pytest 對unittest有比較好的支持。
pytest默認支持的是 函數 風格的測試,但是我們可以不用這一塊嘛(而且很多時候 還是很有用的)。走進項目根目錄,輸入 pytest 就可以啦。它會自動發現 test_ 開頭的文件,然后執行其中 test_ 開頭的函數和 unittest 的 test_ 開頭的 方法。
root@arch tests: pytest ============================================= test session starts ============================================== platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 rootdir: /root/tests, inifile: collected 1 items test_afunc.py . ====================================1 passed in 0.03 seconds ======================================================= root@arch tests:
總結
編譯器沒給python做檢查,就只有靠我們手寫測試了 :(
另外其實 pytest 和 unittest 都有很多強大的特性,例如 fixture,例如 skip 掉某一部分測試。
關于Python如何單元測試就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。