摘要:單元測試這個應用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標準庫中標準的包。為了運行單元測試,可以在腳本中增加一個自定義的命令。
4、啟動腳本
頂層目錄中的manage.py文件用于啟動應用。這個腳本會在示例7-8中展示。
示例7-8. manage.py:啟動腳本
#!/usr/bin/env python import os from app import create_app, db from app.models import User, Role from flask.ext.script import Manager, Shell from flask.ext.migrate import Migrate, MigrateCommand app = create_app(os.getenv("FLASK_CONFIG") or "default") manager = Manager(app) migrate = Migrate(app, db) def make_shell_context(): return dict(app=app, db=db, User=User, Role=Role) manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command("db", MigrateCommand) if __name__ == "__main__": manager.run()
這個腳本開始于創建應用程序。使用環境變量FLASK_CONFIG,若它已經定義了則從中獲取配置;如果沒有,則是用默認配置。然后用于Python shell的Flask-Script、Flask-Migrate以及自定義上下文會被初始化。
為了方便,會增加一行執行環境,這樣在基于Unix的操作系統上可以通過./manage.py來執行腳本來替代冗長的python manage.py。
5、需求文件應用程序必須包含requirements.txt文件來記錄所有依賴包,包括精確的版本號。這很重要,因為可以在不同的機器上重新生成虛擬環境,例如在生產環境的機器上部署應用程序。這個文件可以通過下面的pip命令自動生成:
(venv) $ pip freeze >requirements.txt
當安裝或更新一個包之后最好再更新一下這個文件。以下展示了一個需求文件示例:
Flask==0.10.1 Flask-Bootstrap==3.0.3.1 Flask-Mail==0.9.0 Flask-Migrate==1.1.0 Flask-Moment==0.2.0 Flask-SQLAlchemy==1.0 Flask-Script==0.6.6 Flask-WTF==0.9.4 Jinja2==2.7.1 Mako==0.9.1 MarkupSafe==0.18 SQLAlchemy==0.8.4 WTForms==1.0.5 Werkzeug==0.9.4 alembic==0.6.2 blinker==1.3 itsdangerous==0.23
當你需要完美復制一個虛擬環境的時候,你可以運行以下命令創建一個新的虛擬環境:
(venv) $ pip install -r requirements.txt
當你讀到這時,示例requirements.txt文件中的版本號可能已經過時了。如果喜歡你可以嘗試用最近發布的包。如果遇到任何問題,你可以隨時回退到需求文件中與應用兼容的指定版本。
6、單元測試這個應用非常小以至于不需要太多的測試,但是作為示例會在示例7-9中展示兩個簡單的測試定義。
示例7-9. tests/test_basics.py:單元測試
import unittest from flask import current_app from app import create_app, db class BasicsTestCase(unittest.TestCase): def setUp(self): self.app = create_app("testing") self.app_context = self.app.app_context() self.app_context.push() db.create_all() def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_app_exists(self): self.assertFalse(current_app is None) def test_app_is_testing(self): self.assertTrue(current_app.config["TESTING"])
編寫好的測試使用的是來自于Python標準庫中標準的unittest包。setUp()和tearDown()方法在每個測試之前和之后運行,且任何一個方法必須以test_開頭作為測試來執行。
建議:如果你想要學習更多使用Python的unittest包來寫單元測試的內容,請參閱官方文檔。
setUp()方法嘗試創建一個測試環境,類似于運行應用程序。首先它創建應用程序配置用于測試并激活上下文。這一步確保測試可以和常規請求一樣訪問current_app。然后,當需要的時候,可以創建一個供測試使用的全新數據庫。數據庫和應用程序上下文會在tearDown()方法中被移除。
第一個測試確保應用程序實例存在。第二個測試確保應用程序在測試配置下運行。為了確保tests目錄有效,需要在tests目錄下增加__init__.py文件,不過該文件可以為空,這樣unittest包可以掃描所有模塊并定位測試。
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 7a來切換到這個版本的應用程序。為了確保你已經安裝了所有依賴集,需要運行pip install -r requirements.txt。
為了運行單元測試,可以在manage.py腳本中增加一個自定義的命令。
示例7-10展示如何添加測試命令。
示例7-10. manage.pyt:單元測試啟動腳本
@manager.command def test(): """Run the unit tests.""" import unittest tests = unittest.TestLoader().discover("tests") unittest.TextTestRunner(verbosity=2).run(tests)
manager.command裝飾器使得它可以很容易的實現自定義命令。被裝飾的函數名可以被當做命令名使用,且函數的文檔字符串會顯示幫助信息。test()函數的執行會調用unittest包中的測試運行器。
單元測試可以像下面這樣執行:
(venv) $ python manage.py test test_app_exists (test_basics.BasicsTestCase) ... ok test_app_is_testing (test_basics.BasicsTestCase) ... ok .---------------------------------------------------------------------- Ran 2 tests in 0.001s OK7、數據庫啟動
與單腳本的應用相比,重構后的應用使用不同數據庫。
從環境變量中獲取的數據庫URL作為首選,默認SQLite數據庫作為可選。三個配置中的環境變量和SQLite數據庫文件名是不一樣的。例如,開發配置的URL是從DEV_DATABASE_URL環境變量中獲取,如果沒有定義則會使用名為data-dev.sqlite的SQLite數據庫。
無論數據庫URL源的是哪一個,都必須為新的數據庫創建數據庫表。如果使用了Flask-Migrate來保持遷移跟蹤,數據庫表可以被創建或更新到最近的版本通過下面的命令:
(venv) $ python manage.py db upgrade
相信與否,已經到了第一部分結束的地方。你現在已經學到了Flask必要的基本要素,但是你不確定如何將這些零散的知識組合在一起形成一個真正的應用程序。第二部分的目的是通過開發一個完整的應用程序來帶領你繼續前行。
注:前段時間才知道這本書已經由圖靈社區出版翻譯,已經開始預售了,并于12月19日到貨。喜歡的朋友也可以[點我]購買一本。后面的章節就不再繼續更新了,自己肯定也會去支持這本書的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45321.html
摘要:被定義在包的構造函數中的應用程序工廠函數會在示例中展示。這個構造函數導入大部分當前需要使用的擴展,但因為沒有應用程序實例初始化它們,它可以被創建但不初始化通過不傳遞參數給它們的構造函數。而應用程序范圍內的錯誤處理則必須使用。 雖然小型web應用程序用單個腳本可以很方便,但這種方法卻不能很好地擴展。隨著應用變得復雜,在單個大的源文件中處理會變得問題重重。 與大多數其他web框架不同,Fl...
摘要:他和妻子四個孩子兩只狗和一只貓共同生活在俄勒岡州波特蘭市。。還邀請他根據書的內容,制作了兩個視頻教程。 showImg(http://img4.douban.com/lpic/s27205547.jpg); 這本書算是學習Flask的權威材料了,網上很多人都是推薦從這本書開始學習。起初,作者在自己的博客發布了一個大型的Flask建站教程,在這個教程大受歡迎的基礎上,才與OReilly公...
摘要:注對于開發者來說,傳給應用程序構造函數的參數是比較容易弄混淆的。在應程序中定義路由的最便捷的方式是通過顯示定義在應用程序實例之上的裝飾器,注冊被裝飾的函數來作為一個路由。一個常見的模式是使用裝飾器來注冊函數作為一個事件處理程序。 在這一章,你將學習Flask應用程序不同部分。同時你將編寫和運行你的第一個Flask web應用程序。 1、初始化 在這章,你將學到Flask應用程序的不...
摘要:有兩類應用級和請求級。一個響應中非常重要的部分是狀態碼,默認設置來指示請求已經成功處理。重定向通常由響應狀態碼注明并且重定向的由頭部的給出。因為這些變化,應用程序獲得一組基本的命令行選項。運行顯示可用信息在應用程序上下文的內部運行一個。 5、請求-響應循環 現在你已經玩過一個基本的Flask應用程序,你也許想要知道更多關于Flask如何施展魔力。下面章節描述了一些框架設計方面的特點。...
摘要:用真實的值替換變量并返回最終響應字符串,這個過程稱為渲染。示例展示模板實現該響應。控制結構提供一些控制結構用于改變模板流。這個示例展示如何使用循環做到這些同樣支持宏,這和代碼中的函數很像。 寫代碼最關鍵的是要易于維護且結構清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數希望將兩個應該完全獨立的任務一并處理,兩個任務有兩種代碼,一并處理勢必會引發問題。...
閱讀 2053·2021-11-22 13:52
閱讀 976·2021-11-17 09:33
閱讀 2708·2021-09-01 10:49
閱讀 2841·2019-08-30 15:53
閱讀 2659·2019-08-29 16:10
閱讀 2432·2019-08-29 11:31
閱讀 1343·2019-08-26 11:40
閱讀 1866·2019-08-26 10:59