1. 程式人生 > >flask框架單元測試小案例

flask框架單元測試小案例

前言

單元測試,及測試某塊程式碼的邏輯是否正確。
通過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