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

整个单元测试就是模拟了一个客户端请求的情况
单元测试的是必须后端程序员需要做的~

猜你喜欢

转载自blog.csdn.net/JessePinkmen/article/details/84590398