摘要:單元測試這個應(yīng)用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的包。為了運(yùn)行單元測試,可以在腳本中增加一個自定義的命令。
4、啟動腳本
頂層目錄中的manage.py文件用于啟動應(yīng)用。這個腳本會在示例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()
這個腳本開始于創(chuàng)建應(yīng)用程序。使用環(huán)境變量FLASK_CONFIG,若它已經(jīng)定義了則從中獲取配置;如果沒有,則是用默認(rèn)配置。然后用于Python shell的Flask-Script、Flask-Migrate以及自定義上下文會被初始化。
為了方便,會增加一行執(zhí)行環(huán)境,這樣在基于Unix的操作系統(tǒng)上可以通過./manage.py來執(zhí)行腳本來替代冗長的python manage.py。
5、需求文件應(yīng)用程序必須包含requirements.txt文件來記錄所有依賴包,包括精確的版本號。這很重要,因?yàn)榭梢栽诓煌臋C(jī)器上重新生成虛擬環(huán)境,例如在生產(chǎn)環(huán)境的機(jī)器上部署應(yīng)用程序。這個文件可以通過下面的pip命令自動生成:
(venv) $ pip freeze >requirements.txt
當(dāng)安裝或更新一個包之后最好再更新一下這個文件。以下展示了一個需求文件示例:
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
當(dāng)你需要完美復(fù)制一個虛擬環(huán)境的時候,你可以運(yùn)行以下命令創(chuàng)建一個新的虛擬環(huán)境:
(venv) $ pip install -r requirements.txt
當(dāng)你讀到這時,示例requirements.txt文件中的版本號可能已經(jīng)過時了。如果喜歡你可以嘗試用最近發(fā)布的包。如果遇到任何問題,你可以隨時回退到需求文件中與應(yīng)用兼容的指定版本。
6、單元測試這個應(yīng)用非常小以至于不需要太多的測試,但是作為示例會在示例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標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的unittest包。setUp()和tearDown()方法在每個測試之前和之后運(yùn)行,且任何一個方法必須以test_開頭作為測試來執(zhí)行。
建議:如果你想要學(xué)習(xí)更多使用Python的unittest包來寫單元測試的內(nèi)容,請參閱官方文檔。
setUp()方法嘗試創(chuàng)建一個測試環(huán)境,類似于運(yùn)行應(yīng)用程序。首先它創(chuàng)建應(yīng)用程序配置用于測試并激活上下文。這一步確保測試可以和常規(guī)請求一樣訪問current_app。然后,當(dāng)需要的時候,可以創(chuàng)建一個供測試使用的全新數(shù)據(jù)庫。數(shù)據(jù)庫和應(yīng)用程序上下文會在tearDown()方法中被移除。
第一個測試確保應(yīng)用程序?qū)嵗嬖?。第二個測試確保應(yīng)用程序在測試配置下運(yùn)行。為了確保tests目錄有效,需要在tests目錄下增加__init__.py文件,不過該文件可以為空,這樣unittest包可以掃描所有模塊并定位測試。
建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行git checkout 7a來切換到這個版本的應(yīng)用程序。為了確保你已經(jīng)安裝了所有依賴集,需要運(yùn)行pip install -r requirements.txt。
為了運(yùn)行單元測試,可以在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裝飾器使得它可以很容易的實(shí)現(xiàn)自定義命令。被裝飾的函數(shù)名可以被當(dāng)做命令名使用,且函數(shù)的文檔字符串會顯示幫助信息。test()函數(shù)的執(zhí)行會調(diào)用unittest包中的測試運(yùn)行器。
單元測試可以像下面這樣執(zhí)行:
(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、數(shù)據(jù)庫啟動
與單腳本的應(yīng)用相比,重構(gòu)后的應(yīng)用使用不同數(shù)據(jù)庫。
從環(huán)境變量中獲取的數(shù)據(jù)庫URL作為首選,默認(rèn)SQLite數(shù)據(jù)庫作為可選。三個配置中的環(huán)境變量和SQLite數(shù)據(jù)庫文件名是不一樣的。例如,開發(fā)配置的URL是從DEV_DATABASE_URL環(huán)境變量中獲取,如果沒有定義則會使用名為data-dev.sqlite的SQLite數(shù)據(jù)庫。
無論數(shù)據(jù)庫URL源的是哪一個,都必須為新的數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫表。如果使用了Flask-Migrate來保持遷移跟蹤,數(shù)據(jù)庫表可以被創(chuàng)建或更新到最近的版本通過下面的命令:
(venv) $ python manage.py db upgrade
相信與否,已經(jīng)到了第一部分結(jié)束的地方。你現(xiàn)在已經(jīng)學(xué)到了Flask必要的基本要素,但是你不確定如何將這些零散的知識組合在一起形成一個真正的應(yīng)用程序。第二部分的目的是通過開發(fā)一個完整的應(yīng)用程序來帶領(lǐng)你繼續(xù)前行。
注:前段時間才知道這本書已經(jīng)由圖靈社區(qū)出版翻譯,已經(jīng)開始預(yù)售了,并于12月19日到貨。喜歡的朋友也可以[點(diǎn)我]購買一本。后面的章節(jié)就不再繼續(xù)更新了,自己肯定也會去支持這本書的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45321.html
摘要:被定義在包的構(gòu)造函數(shù)中的應(yīng)用程序工廠函數(shù)會在示例中展示。這個構(gòu)造函數(shù)導(dǎo)入大部分當(dāng)前需要使用的擴(kuò)展,但因?yàn)闆]有應(yīng)用程序?qū)嵗跏蓟鼈儯梢员粍?chuàng)建但不初始化通過不傳遞參數(shù)給它們的構(gòu)造函數(shù)。而應(yīng)用程序范圍內(nèi)的錯誤處理則必須使用。 雖然小型web應(yīng)用程序用單個腳本可以很方便,但這種方法卻不能很好地擴(kuò)展。隨著應(yīng)用變得復(fù)雜,在單個大的源文件中處理會變得問題重重。 與大多數(shù)其他web框架不同,F(xiàn)l...
摘要:他和妻子四個孩子兩只狗和一只貓共同生活在俄勒岡州波特蘭市。。還邀請他根據(jù)書的內(nèi)容,制作了兩個視頻教程。 showImg(http://img4.douban.com/lpic/s27205547.jpg); 這本書算是學(xué)習(xí)Flask的權(quán)威材料了,網(wǎng)上很多人都是推薦從這本書開始學(xué)習(xí)。起初,作者在自己的博客發(fā)布了一個大型的Flask建站教程,在這個教程大受歡迎的基礎(chǔ)上,才與OReilly公...
摘要:注對于開發(fā)者來說,傳給應(yīng)用程序構(gòu)造函數(shù)的參數(shù)是比較容易弄混淆的。在應(yīng)程序中定義路由的最便捷的方式是通過顯示定義在應(yīng)用程序?qū)嵗系难b飾器,注冊被裝飾的函數(shù)來作為一個路由。一個常見的模式是使用裝飾器來注冊函數(shù)作為一個事件處理程序。 在這一章,你將學(xué)習(xí)Flask應(yīng)用程序不同部分。同時你將編寫和運(yùn)行你的第一個Flask web應(yīng)用程序。 1、初始化 在這章,你將學(xué)到Flask應(yīng)用程序的不...
摘要:有兩類應(yīng)用級和請求級。一個響應(yīng)中非常重要的部分是狀態(tài)碼,默認(rèn)設(shè)置來指示請求已經(jīng)成功處理。重定向通常由響應(yīng)狀態(tài)碼注明并且重定向的由頭部的給出。因?yàn)檫@些變化,應(yīng)用程序獲得一組基本的命令行選項(xiàng)。運(yùn)行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運(yùn)行一個。 5、請求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計方面的特點(diǎn)。...
摘要:用真實(shí)的值替換變量并返回最終響應(yīng)字符串,這個過程稱為渲染。示例展示模板實(shí)現(xiàn)該響應(yīng)??刂平Y(jié)構(gòu)提供一些控制結(jié)構(gòu)用于改變模板流。這個示例展示如何使用循環(huán)做到這些同樣支持宏,這和代碼中的函數(shù)很像。 寫代碼最關(guān)鍵的是要易于維護(hù)且結(jié)構(gòu)清晰整潔。目前為止,你看到的例子都過于簡單從而沒有做這方面的要求。Flask視圖函數(shù)希望將兩個應(yīng)該完全獨(dú)立的任務(wù)一并處理,兩個任務(wù)有兩種代碼,一并處理勢必會引發(fā)問題。...
閱讀 2066·2021-11-22 13:52
閱讀 991·2021-11-17 09:33
閱讀 2719·2021-09-01 10:49
閱讀 2853·2019-08-30 15:53
閱讀 2665·2019-08-29 16:10
閱讀 2438·2019-08-29 11:31
閱讀 1364·2019-08-26 11:40
閱讀 1877·2019-08-26 10:59