Python框架学习之Flask中的蓝图与单元测试

时间:2022-10-09 13:00:30

  因为Flask框架的集成度很低,随着Flask项目文件的增多,会导致不太好管理。但如果对一个项目进行模块化管理的,那样子管理起来就会特别方便。而在Flask中刚好就提供了这么一个特别好用的工具蓝图(Blueprint)。在进行团队开发时,为了保证我们写的代码更加稳定,一般需要进行单元测试。该如何进行单元测试呢?

一、Blueprint

  1.什么是蓝图

   可以把蓝图当做一个存储视图的容器,被蓝图装饰过的函数,会被保存起来,然后把这个蓝图注册到项目中的APP之后就被蓝图装饰的函数可以使用了。

   蓝图的作用就是把多个文件中的视图绑定到项目的app中,这样就能处理请求了。说白了就是一种模块化管理。

  2.蓝图的特点

   (1). 一个应用中可以有多个蓝图

   (2). 在初始化应用后,一般就需要把蓝图注册到应用中。但是不能反过来。

   (3). 可以将一个蓝图注册到一个未使用的url下,这样被这个蓝图装饰的视图默认就是在这个url下。

   注意:一个蓝图不是一个完整的应用,不能独立于应用运行,必须注册到某个应用中。

  3. 使用蓝图步骤:

   (1). 创建一个蓝图对象

   (2). 使用蓝图对象注册路由等操作

   (3). 在应用上注册这个对象

  4. 运行机制

   (1). 蓝图保存了一组可以在应用对象上执行的操作,如注册路由

   (2). 当在应用对象调用route装饰器注册路由时,这个操作将修改对象的url_map路由表

   (3). 但是,蓝图没有路由表,当在蓝图对象上调用route()装饰器注册路由时,只是在内部的一个延时操作记录列表defered_funcitons中添加了一项。

   (4). 当调用应用对象的register_blueprint()时,应用对象将从蓝图对象的defered_functions列表中取出每一项,实际上是调用应用对象那个的add_url_rule(),这真正的改变了应用对象的路由表(url_map)。

 

二、具体应用如下:

app.py

 1 from flask import Flask, Blueprint  2 
 3 from blueprint import admin  4 
 5 app = Flask(__name__)  6 
 7 # 3.注册蓝图对象
 8 # url_prefix参数指明,由api装饰的函数,其url必须有/admin
 9 app.register_blueprint(admin, url_prefix='/admin') 10 
11 
12 @app.route('/') 13 def index(): 14     return 'index'
15 
16 
17 @app.route('/list') 18 def list(): 19     return 'list'
20 
21 
22 @app.route('/detail') 23 def detail(): 24     return 'detail'
25 
26 
27 if __name__ == '__main__': 28     print(app.url_map) 29     app.run(debug=True)

admin.py文件:

 1 from flask import Blueprint  2 
 3 
 4 # 1.创建一个蓝图对象
 5 admin = Blueprint('admin', __name__)  6 
 7 
 8 # 2. 使用蓝图对象装饰函数
 9 @admin.route('/new') 10 def new(): 11     return 'new'
12 
13 
14 @admin.route('/edit') 15 def edit(): 16     return 'edit'
17 
18 
19 @admin.route('/publish') 20 def publish(): 21     return 'publish'

url_map如下:

Python框架学习之Flask中的蓝图与单元测试

  

 

三、单元测试

  1.为什么要单元测试

    虽然测试有专门的测试人员,但是为了提高我们自身代码的稳定性,我们一般都要为自己写的代码做单元测试,这样开发的效率会大大提高。单元测试就是我们写的一小段代码,来检验目标代码的功能是否符合预期。在Web开发中,单元测试很简单,就是一个"断言"(assert)代码

  2. 断言

    在Python中,使用assert语句来判断预期结果。

    常用断言:

     (1). assertEqual:如果两个值相等,则pass

     (2). assertNotEqual:如果两个值不相等,则pass

     (3). assertTrue:判断bool值为True,则pass

     (4). assertFlase:判断bool值为False, 则pass

     (5). assertIsNone:不存在,则pass

     (6). assertIsNotNone:存在,则pass

  3. 单元测试的写法

    (1). 自定义一个类,继承自unittest.TestCase

    (2). 类中两个固定方法setUp()和tearDown():做初始化和回收资源的任务

    (3). 自定义以"test"开头的方法,用来测试某些功能。

 

  4.对数据库进行测试:  

 1 import unittest  2 
 3 from author_book_models import app, db, Author, Book  4 
 5 
 6 class DatabaseTestCase(unittest.TestCase):  7     """数据库单元测试"""
 8 
 9     def setUp(self): 10         # 要进行测试的话,需要开启这个配置信息
11         app.config['TESTING'] = True 12         self.app = app 13  db.create_all() 14 
15     def tearDown(self): 16  db.session.remove() 17  db.drop_all() 18 
19     def test_append_data(self): 20         """添加数据"""
21 
22         au = Author(name='laowang') 23         bk = Book(info='python') 24 
25  db.session.add_all([au, bk]) 26  db.session.commit() 27 
28         author = Author.query.filter_by(name='laowang').first() 29         book = Book.query.filter_by(info='python').first() 30 
31         # 断言数据存在
32  self.assertIsNotNone(author) 33         self.assertIsNotNone(book)