閱讀675 返回首頁    go 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

  上一篇:go Python發展和就業不二選擇
  下一篇:go 如何用 Python 成為搶手的數據人才?