Flask藍圖單元測試
Flask藍圖單元測試
特重要
1.藍圖
想從別的模版匯入檢視函式,別的模組不能用主模組匯入的app,所以用到藍圖這個概念,子模組用藍圖裝飾檢視函式,這樣主模組只用匯入藍圖例項化的物件,再到主模組裡註冊一下被匯入的藍圖,這樣主模組和子模組的url_map就關聯起來了!
app.url_map
Mini web會調函式
要從別的模組匯入變數函式 用到藍圖
不使用app註冊檢視函式
主模組
form flask import Flask from order import order_blu app = Flask(__name__) app.register_blueprint(order_blu)
子模組
from flask import Blueprint
order_blu = Blueprint('order',__name__)
@order_blu.route('')
def xxx:
xxx
通常是用個包裡使用藍圖,在init裡同理匯入藍圖,例項化物件,裝飾檢視函式
這裡用到包的知識,包下:
__init__.py
:註冊藍圖,導回下面的檔案
from flaks import Blueprint
cart_blu = Blueprint('cart',__name__)
from .views import * #倒回檢視函式
views.py
from . import cart_blu
@cart_blu
def xxx:
xxx
所以來說,__init__.py
不寫業務邏輯!
藍圖靜態檔案訪問
Blueprint 的
static_folder屬性:靜態資料夾
url_prefix關鍵字引數:在應用最終的路由表 url_map中,在藍圖上註冊的路由URL自動被加上了這個字首,這個可以保證在多個藍圖中使用相同的URL規則而不會最終引起衝突。
template_floder 模板資料夾屬性:
如果主目錄和模組模版檔案相同,優先訪問主目錄的模版
藍圖執行機制:
藍圖物件沒有路由表,在藍圖物件中裝飾檢視函式時候,是在內部的一個延遲操作記錄列表defered_functions中添加了一個項,當app.register_blueprint(),遍歷在延遲操作列表中取出每一項,以自身作為引數執行列表中每一項匿名函式func,作為執行內容就是add_url_map;
python匿名函式怎麼執行:不是定義的時候執行,func
2.單元測試
需求分析,設計,實現,測試。
單元測試:對單獨的程式碼塊分別進行測試以保證正確性,判斷一個函式或者一個物件是否符合預期,實際就是一些斷言assert程式碼
assert isinstance(num1,int),'值型別不正確'
import unittest
from demo2 import app
class LoginTestCase(unittest.TestCase):
def test_empty_username_password(self):
response_data=app.test_client().post('/login',data={})
json_dict = json.loads(response_data)
print(response)
self.assertIsNotNone(json_dict,'我獲取到資料')
self.assertIn('errcode',json_dict,'返回資料格式不正確')
單元測試的方法要以test開頭,單元測試的套路都是一樣的
單元測試類裡的setUp方法是在開始測試之前會呼叫這個放啊,裡面可以做一些初始操作,例如操作資料庫之類的
def setUp(self):
app.testing = True//報錯錯誤的具體程式碼
self.client = app.test_client()
同理也有tearDown方法,是在測試結束的時候呼叫這個方法,下面是一個數據庫測試的demo
import unittest
from demo3_bookDemo import app, db, Author
class DataBaseTestCase(unittest.TestCase):
def setUp(self):
app.config
app.config
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_add_and_delete_author(self):
author = Author(name='哈哈')
db.session.add(author)
db,session.commit()
#查詢
author = Author.query.filter(Author.name == '哈哈').first()
self.assertIsNotNone(author)
#刪除.author是模型,這是把表都刪除了
db.session.delete(author)
db.session.commit()
整個單元測試就是模擬了一個客戶端請求的情況
單元測試的是必須後端程式設計師需要做的~