1. 程式人生 > >Flask藍圖單元測試

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()

整個單元測試就是模擬了一個客戶端請求的情況
單元測試的是必須後端程式設計師需要做的~