1. 程式人生 > >三十六、python學習之Flask框架: 藍圖和單元測試

三十六、python學習之Flask框架: 藍圖和單元測試

一、藍圖和單元測試:

1.藍圖:

隨著flask程式越來越複雜,我們需要對程式進行模組化的處理,之前學習過python的模組化管理,於是針對一個簡單的flask程式進行模組化處理

名詞解釋:

高內聚,低耦合:

  所謂高內聚是指一個軟體模組是由相關性很強的程式碼組成,只負責一項任務,也就是常說的單一責任原則。
  對於低耦合,粗淺的理解是:一個完整的系統,模組與模組之間,儘可能的使其獨立存在。也就是說,讓每個模組,儘可能的獨立完成某個特定的子功能。模組與模組之間的介面,儘量的少而簡單。如果某兩個模組間的關係比較複雜的話,最好首先考慮進一步的模組劃分。這樣有利於修改和組合。

解耦合:

  模組間有依賴關係必然存在耦合,理論上的絕對零耦合是做不到的,但可以通過一些現有的方法將耦合度降至最低。

2. 使用步驟:

  • 建立藍圖物件
  • 使用藍圖物件
  • 註冊藍圖物件

demo01_blueprint.py:

from flask import Flask
from temp_file import api

app = Flask(__name__)

# 註冊藍圖到程式例項app上
app.register_blueprint(api)

@app.route("/")
def index():
    return "hello world!"

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

temp_file.py:

# 匯入藍圖模組
from flask import Blueprint
# 建立藍圖物件,第一個引數表示藍圖的名稱,第二個引數是檔名
api = Blueprint("api",__name__)

# 把temp_detail檔案匯入到建立藍圖物件的檔案中
# 需要把導包語句寫到建立藍圖物件的下面
from temp_detail import detail

# 使用藍圖建立檢視函式
@api.route("/list")
def list():
    return "list..."

temp_detail.py

# 匯入temp_file檔案中的藍圖物件
from temp_file import api

@api.route("/detail")
def detail():
    return "detail..."

二、單元測試:

1.為什麼要測試:

Web程式開發過程一般包括以下幾個階段:[需求分析,設計階段,實現階段,測試階段]。其中測試階段通過人工或自動來執行測試某個系統的功能。目的是檢驗其是否滿足需求,並得出特定的結果,以達到弄清楚預期結果和實際結果之間的差別的最終目的。

2.測試分類:

測試從軟體開發過程可以分為:

  • 單元測試
    • 對單獨的程式碼塊(例如函式)分別進行測試,以保證它們的正確性
  • 整合測試
    • 對大量的程式單元的協同工作情況做測試
  • 系統測試
    • 同時對整個系統的正確性進行檢查,而不是針對獨立的片段

3.斷言:

3.1斷言原理:

  在Web開發過程中,單元測試實際上就是一些“斷言”(assert)程式碼。
  斷言就是判斷一個函式或物件的一個方法所產生的結果是否符合你期望的那個結果。 python中assert斷言是宣告布林值為真的判定,如果表示式為假會發生異常。單元測試中,一般使用assert來斷言結果。
類似於:

if not expression:    
    raise AssertionError
 AssertionError

3.2 常用的斷言方法:

方法 說明
assertEqual 如果兩個值相等,則pass
assertNotEqual 如果兩個值不相等,則pass
assertTrue 判斷bool值為True,則pass
assertFalse 判斷bool值為False,則pass
assertIsNone 不存在,則pass
assertIsNotNone 存在,則pass

4.書寫單元測試:

  • 定義一個類,繼承自unittest.TestCase
  • 重寫兩個方法:setUp()和tearDown()
  • 測試方法必須以test_開頭
  • 對資料庫測試,最後必須先移除資料庫回話物件 db.session.remove()

單元測試: 圖書管理系統

# 匯入python中的測試框架,測試模組
import unittest
# 匯入被測試的檔案
from demo2_author_book import *

# 自定義測試類
class TestDatabase(unittest.TestCase):

    # 方法名固定的,類似於初始化函式,會被首先執行
    def setUp(self):
        self.app = app
        app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]/test_python32'
        db.create_all()

    # 方法名固定的,類似於解構函式,會被最後執行
    def tearDown(self):
        # 移除資料庫會話物件
        db.session.remove()
        db.drop_all() # 刪除所有表


    # 測試方法的定義,方法名必須以test開頭
    def test_add_author_book(self):
        itcast = Author(name='itcast')
        book = Book(info='python')
        db.session.add_all([itcast,book])
        db.session.commit()
        # 查詢資料,確認提交資料成功
        auth = Author.query.filter(Author.name=='itcast').first()
        bk = Book.query.filter_by(info='python').first()
        # 斷言資料存在
        self.assertIsNotNone(auth)
        self.assertIsNotNone(bk)