flask框架單元測試小案例
阿新 • • 發佈:2018-12-16
前言
單元測試,及測試某塊程式碼的邏輯是否正確。
通過flask物件的客戶端來模擬傳送請求。
使用斷言assert進行判斷,斷言成功,程式繼續執行;斷言失敗,丟擲斷言失敗。
登入程式碼(login.py)
# -*- coding:utf-8 -*- from flask import Flask from flask import request, jsonify app = Flask(__name__) @app.route("/login", methods=["POST"]) def login(): username = request.form.get("username") password = request.form.get("password") if not all([username, password]): resp = { "code": 1, "message": "invalid params" } return jsonify(resp) if username == "admin" and password == "python": resp = { "code": 0, "message": "login success" } return jsonify(resp) else: resp = { "code": 2, "message": "wrong user or password" } return jsonify(resp) if __name__ == "__main__": app.run(debug=True)
測試登入程式碼(test.py)
# -*- coding:utf-8 -*- import unittest from .login import app import json class LoginTest(unittest.TestCase): """構造單元測試案例""" def setUp(self): # 功能類似於def __init__ # 設flask工作在測試模式下 # app.config["TESTING"] = True # 方式一 app.testing = True #方式二 # 使用flask建立客戶端 self.client = app.test_client() def test_empty_username_password(self): """測試使用者名稱和密碼為空的情況""" # 模擬客戶端傳送請求,返回響應物件 ret = self.client.post("/login", data={}) # 獲取響應體的資料(是json) resp = ret.data resp = json.loads(resp) # 斷言 self.assertIn("code", resp) self.assertEqual(resp["code"], 1) def test_wrong_username_password(self): """測試使用者名稱獲密碼錯誤的情況""" # 模擬客戶端傳送請求,返回響應物件 ret = self.client.post("/login", data={ "username": "admin", "password": "abc" }) # 獲取響應體的資料(是json) resp = ret.data resp = json.loads(resp) # 斷言 self.assertIn("code", resp) self.assertEqual(resp["code"], 2) def test_login_sucess(self): """測試登入成功的情況""" # 模擬客戶端傳送請求,返回響應物件 ret = self.client.post("/login", data={ "username": "admin", "password": "python" }) # 獲取響應體的資料(是json) resp = ret.data resp = json.loads(resp) # 斷言 self.assertIn("code", resp) self.assertEqual(resp["code"], 0) if __name__ == "__main__": # 啟動測試 unittest.main()
測試結果
Testing started at 12:40 ... D:\filepython\projects\flaskprojects\venv\Scripts\python.exe "D:\software\pycharm\dir\PyCharm Community Edition 2018.3\helpers\pycharm\_jb_pytest_runner.py" --path D:/filepython/projects/flaskprojects/application/test.py Launching pytest with arguments D:/filepython/projects/flaskprojects/application/test.py in D:\filepython\projects\flaskprojects\application ============================= test session starts ============================= platform win32 -- Python 3.6.7, pytest-4.0.1, py-1.7.0, pluggy-0.8.0 rootdir: D:\filepython\projects\flaskprojects\application, inifile:collected 3 items test.py ... [100%] ============================== warnings summary =============================== D:\filepython\projects\flaskprojects\venv\lib\site-packages\jinja2\filters.py:24 D:\filepython\projects\flaskprojects\venv\lib\site-packages\jinja2\filters.py:24: DeprecationWarning: Flags not at the start of the expression '\\w+(?u)' _word_re = re.compile(r'\w+(?u)') -- Docs: https://docs.pytest.org/en/latest/warnings.html ==================== 3 passed, 1 warnings in 0.70 seconds ===================== Process finished with exit code 0