675
Python
Python 測試驅動開發
作者:蟲師
來源:https://www.cnblogs.com/fnng/p/5598546.html
最近在看一本書《Test-Driven Development with Python》,裏麵非常詳細的介紹了如何一步一步通過測試驅動開發(TDD)的方式開發Web項目。剛好這本書中使用了我之前所了解的一些技術,Django、selenium、unittest等。所以,讀下來受益匪淺。
我相信不少開發都寫單元測試,不過,一般是先寫功能代碼,然後,再寫單元測試用例,在編寫單元測試用例的過程中,可能需要調整功能代碼,從而使單元測試用例通過。但是TDD就特別要求先寫測試用例,後寫實現代碼。這一開始確實有些難。
這裏就選擇一個簡單的例子向各位介紹一下TDD的流程(套路)。
編寫功能測試用例:
首先,編寫功能測試用例,functional_tests.py
你沒看錯,這就是由Selenium編寫的功能測試代碼。打開Firefox瀏覽器,並訪問https://127.0.0.1:8000,通過assert 判斷瀏覽器標題是否包含"Django"。
然後,運行該測試用例。
測試用例失敗了,這是必然的,因為我們還沒有創建被測試的項目。但,這同樣也是我們想要的結果。TDD的套路就是通過編寫功能代碼,使測試用例通過。
創建項目:
接下來創建Django項目:
D:pydj>django-admin startproject superlists
當前項目結構如下:
進入項目目錄,啟動項目:
再次運行功能測試用例,functional_tests.py
接下來繼續編寫功能測試用例。functional_tests.py
這裏用到了unittest 單元測試框架。如果,你不懂Python的單元測試,建議讀者去學習unittest。
執行測試用例:
測試用例又在預料之內的失敗了!先不要著急解決這個問題,把項目創建完成。
D:pydjsuperlists>python3 manage.py startapp lists
將functional_tests.py放到superlists項目目錄下。
單元測試與功能測試的區別:
正如給事物所貼的眾多標簽一樣,單元測試和功能測試之間的界線有時不那麼清晰。不過,二者之間有個基本區別:功能測試站在用戶的角度從外部測試應用,單元測試則站在程序員的角度從內部測試應用。
我遵從的 TDD 方法同時使用這兩種類型測試應用。采用的工作流程大致如下。
(1) 先寫功能測試,從用戶的角度描述應用的新功能。
(2) 功能測試失敗後,想辦法編寫代碼讓它通過(或者說至少讓當前失敗的測試通過)。此時,使用一個或多個單元測試定義希望代碼實現的效果,保證為應用中的每一行代碼
(3) 單元測試失敗後,編寫最少量的應用代碼,剛好讓單元測試通過。有時,要在第 2 步和第 3 步之間多次往複,直到我們覺得功能測試有一點進展為止。
(4) 然後,再次運行功能測試,看能否通過,或者有沒有進展。這一步可能促使我們編寫一些新的單元測試和代碼等。
由此可以看出,這整個過程中,功能測試站在高層驅動開發,而單元測試則從低層驅動我們做些什麼。
打開/lists/tests.py文件,編寫單元測試。
運行單元測試:
OK,說明單元測試沒問題。接下來就要編寫真正的單元測試了(/lists/tests.py)。
第一個用例(testrooturlresolvestohomepage_view):
resolve 是 Django 內部使用的函數,用於解析 URL,並將其映射到相應的視圖函數上。檢查解析網站根路徑" /" 時,是否能找到名為 home_page 的函數。
第二個用例(testhomepagereturnscorrect_html):
創建了一個 HttpRequest 對象,用戶在瀏覽器中請求網頁時, Django 看到的就是HttpRequest 對象。把這個 HttpRequest 對象傳給 home_page 視圖,得到響應。聽說響應對象是 HttpResponse類的實例時,你應該不會覺得奇怪。接下來我們斷定響應的 .content 屬性(即發送給用戶的 HTML)中有特定的內容。
assertTrue()希望響應以 標簽開頭,並在結尾處關閉該標簽。注意, response.content 是原始字節,不是 Python 字符串,因此對比時要使用 b 句法。b是BYTE字符串
assertIn()希望響應中有一個 )
運行單元測試使其通過:
最後不要忘了,配置superlists/urls.py文件。
最後的最後,啟動服務:
D:pydjsuperlists>python manage.py runserver
運行功能測試用例使其通過:
書的內容極其連貫,整本書學下來,相當於自己動手通過TDD的方式開發了一個項目。我這裏有所刪減。
感興趣的可以買這本書的中文版來學習。《Python web開發:測試驅動方法》 這中文名翻譯的。。。
題圖:pexels,CC0 授權。
最後更新:2017-10-08 21:25:13