摘要:當功能越來越復雜的時候,你可能修改了一些東西,導致另外一個功能的不可用,而單元測試也能保證了原有功能被破壞后能被檢測出來。
前一篇講到了 TDD 測試驅動開發的相關概念和環境搭建,這篇就著手開始用TDD方式開發了。首先這篇需要編寫用戶相關的API接口,如用戶注冊、用戶登錄、用戶驗證等功能。
編寫測試這里使用 Python 自帶的測試框架 unittest 來編寫簡單測試,后續會使用更好用的 pytest 框架來完成整個網站的測試。
首先,最基本的測試是 Flask 應用實例是否存在,新建一個 test_basic.py 文件,當前 v2ex 項目結構如下:
├── LICENSE ├── Pipfile ├── Pipfile.lock ├── README.md └── tests ├── test_basic.py └── test_user.py
編寫 test_user.py 代碼如下:
import unittest from flask import current_app from server import create_app class UserTestCase(unittest.TestCase): def setUp(self): self.app = create_app("testing") self.app_context = self.app.app_context() self.app_context.push() def tearDown(self): self.app_context.pop() def test_app_is_exist(): """測試 Flask 實例是否存在""" self.assertFalse(current_app is None) if __name__ == "__main__": unittest.main()
這里使用 unittest 編寫了一個測試類,setUp() 和 tearDown() 允許執行每個測試用例前分別初始化和清理測試環境,setUp 可用于創建應用實例,然后測試完成后就通過 tearDown 函數清理.
很明顯,這個測試肯定是失敗的,因為很明顯
from server import create_app
這一行是什么東東啊,好像項目里沒有存在啊,這就是 TDD 的一個概念了,先編寫一個預料之中的失敗,然后一步步的把失敗那部分改進到測試成功為止。
新建一個 server 包,用于保存 v2ex 的業務邏輯代碼,下面是當前項目的結構:
v2ex ├── LICENSE ├── Pipfile ├── Pipfile.lock ├── README.md ├── server │?? └── __init__.py └── tests ├── test_basic.py └── test_user.py
為了組織好模塊,會將多個模塊分為包。簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 然后可以在 __init__.py 文件中新增創建 Flask 實例的工廠函數,代碼如下所示:
from flask import Flask from config import config def create_app(config_name: str): """ 工廠函數,用于延遲創建 Flask 實例,可用于創建多個實例. :param config_name: 配置名稱,可根據開發環境、測試環境、生產環境區分 :return: Flask 示例 """ app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app) return app
然后運行 tests 文件夾下的 test_basic.py 文件,
$ python3 tests/test_basic.py Ran 1 test in 0.007s FAILED (errors=1) Error Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 59, in testPartExecutor yield File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 611, in run self.setUp() File "/Users/guoweikuang/project/github/v2ex/tests/test_basic.py", line 14, in setUp self.app = create_app("testing") File "/Users/guoweikuang/project/github/v2ex/server/__init__.py", line 17, in create_app app.config.from_object(config[config_name]) NameError: name "config" is not defined
這還不能成功,因為我們從最開始就說過,要使用最佳實踐方式來一步步實現網站,因此實例化 Flask 需要多帶帶存在一個配置模塊(config.py),目的就是把配置和其它功能區分開。
而且 TDD 的思想就是每次編寫最少量的代碼取得一些進展,再運行測試,如此不斷重復,直到測試成功為止,最后可能還要重構代碼,測試能保證不破壞任何一個功能。
當前文件結構如下:
v2ex ├── LICENSE ├── Pipfile ├── Pipfile.lock ├── README.md ├── config.py ├── server │?? └── __init__.py └── tests ├── test_basic.py └── test_user.py
前面一節已經知道測試失敗原因,這一節就編寫一個config.py 模塊使單元測試通過:
class Config(object): """ 配置基類,所有其它配置類都要繼承該類. """ @staticmethod def init_app(app): pass class DevelopmentConfig(Config): """ 開發環境配置 """ DEBUG = True class ProductionConfig(Config): """ 生產環境配置 """ DEBUG = False class TestingConfig(Config): """ 測試環境配置 """ TESTING = True DEBUG = True config = { "development": DevelopmentConfig, "product": ProductionConfig, "testing": TestingConfig, "default": DevelopmentConfig, }
使用最少的代碼使測試成功,然后運行 test_basic.py 看看測試是否通過
$ python tests/test_basic.py . ---------------------------------------------------------------------- Ran 1 test in 0.001s OK總結
從上面步驟可以總結到,先寫測試代碼,然后設法使測試一步步通過的 TDD 開發方式是十分有用的,保證了開發的功能符合預期的想法。當功能越來越復雜的時候,你可能修改了一些東西,導致另外一個功能的不可用,而單元測試也能保證了原有功能被破壞后能被檢測出來。這里的代碼都可以到 v2ex
項目中查看,每一篇文章都對應著一個 tag, 想要查看每篇文章的修改可以切到對應標簽上查看。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42631.html
摘要:測試驅動開發簡稱,是一種軟件開發過程中的應用方法,,由極限編程中倡導,以其倡導先寫測試程序,然后編碼實現其功能得名。測試驅動著整個開發過程首先,驅動代碼的設計和功能的實現其后,驅動代碼的再設計和重構。 showImg(https://segmentfault.com/img/remote/1460000017081716); 前言 一直都有聽到 TDD 測試驅動開發的開發方式,之前看...
摘要:前置條件這不是一個入門課程。此課程為至少有六個月網站開發經驗的高級入門者設置。主題資源目標這部分結束,具備以下能力。。。第一部分完整代碼依賴第一部分依賴耗時一章需要幾個小時到一整天。空余大塊時間來完成一章,特別是,,這些較難的部分。 在第一部分, 你學到如何使用 Docker 來創建一個基于python, postgres, 和 flask web 框架的 RESTful API 可重...
摘要:現在有了之后,部署方式變了更加容易,不容易出現配置錯誤,環境不一致問題。實際應用中,經常遇到多個容器相配合運行一套應用程序的情況。所以想要將應用運行在容器中,該容器必須將該應用所有的環境依賴安裝好。 showImg(https://segmentfault.com/img/remote/1460000017081815); 背景 ??以前部署應用,需要各種環境配置,各種shell操作...
摘要:現在有了之后,部署方式變了更加容易,不容易出現配置錯誤,環境不一致問題。實際應用中,經常遇到多個容器相配合運行一套應用程序的情況。所以想要將應用運行在容器中,該容器必須將該應用所有的環境依賴安裝好。 showImg(https://segmentfault.com/img/remote/1460000017081815); 背景 ??以前部署應用,需要各種環境配置,各種shell操作...
摘要:目前就職于,他在各種演講研討會和開發者大會上積極推廣測試驅動開發。問很多敏捷教練都表示訓練新人做測試驅動開發是一件辛苦而進度緩慢的事,并且收益也不是很大。首先是開發的對話式風格。第一個問題就是測試套件的速度。 Harry J.W. Percival目前就職于PythonAnywhere,他在各種演講、研討會和開發者大會上積極推廣測試驅動開發(TDD)。他在利物浦大學獲得計算機科學碩士學...
閱讀 1808·2021-11-23 09:51
閱讀 1268·2021-11-18 10:02
閱讀 962·2021-10-25 09:44
閱讀 2098·2019-08-26 18:36
閱讀 1619·2019-08-26 12:17
閱讀 1145·2019-08-26 11:59
閱讀 2746·2019-08-23 15:56
閱讀 3350·2019-08-23 15:05