python - 如何为我的 Flask API 编写 UnitTest
问题描述
我对单元测试相当陌生,我需要为我的烧瓶 api 编写一些单元测试。知道如何为下面的代码编写单元测试吗?任何示例和帮助将不胜感激。我试图创建一个单独的文件来开始单元测试,但我无法将烧瓶应用程序导入到文件中,因为它给了我模块错误。除此之外,我不确定如何测试此应用程序中的每个功能。
from flask import Flask, request, Response, send_file
import machine_learning_model.Object_detection.yoloModel as yoloModel
import jsonpickle
import numpy as np
import cv2
import base64
import json
import ast
import requests
app = Flask(__name__)
url_base = 'http://192.168.1.6:5000'
predict_image_api = '/v1/api/predict'
bounding_box_API = '/v1/resoures/predict_images/'
# Load YOLO model
labels, colors = yoloModel.load_label("coco.names")
net, ln = yoloModel.load_model()
# route http posts to this method
@app.route(predict_image_api, methods=['GET', 'POST'])
def predict():
loaded_body = parse_json_from_request(request)
# Conversion of base64 image back to its binary
img_original = base64.b64decode(loaded_body['image'])
# Conversion of image data to unit8
jpg_as_np = np.frombuffer(img_original, dtype=np.uint8)
# Decoding the image
image = cv2.imdecode(jpg_as_np, cv2.IMREAD_COLOR)
idxs, boxes, confiences, centers, classIDs = yoloModel.detectObjectFromImage(image, net, ln)
objectProperty = yoloModel.bouding_box(idxs, image, boxes, colors, labels, classIDs, confiences)
response = {
'objectProperty':''
}
response['objectProperty'] = objectProperty
print(response)
# encode response using jsonpickle
response_pickled = jsonpickle.encode(response)
return Response(response=response_pickled, status=200, mimetype="application/json")
@app.route(bounding_box_API+'<name>', methods=['GET'])
def get_image(name):
filename = 'predict_images/output_resize_%s.jpg' % name
print(filename)
return send_file(filename, mimetype='image/gif')
def parse_json_from_request(request):
body_dict = request.json
body_str = json.dumps(body_dict)
loaded_body = ast.literal_eval(body_str)
return loaded_body
if __name__ == "__main__":
# start flask app
app.run()
解决方案
首先,我推荐使用pytest。
为了进行正确的单元测试,您的程序应拆分为最好只执行一项任务的简单函数。
由于您正在使用requests
,您可能想要测试您的 HTTP 调用。测试它们的一个好方法是使用响应来模拟目标服务器或 API。
务实地,开始创建一个文件夹tests/
并为每个类或每个函数创建一个文件,以你要测试的类或函数命名(像这样test_your_function.py
)。test_
在此文件中,为您的函数编写单元测试(即,一个以pytest
将其标识为单元测试的函数开头)。每个单元测试都应该包含一个assert tested_output_value == expected_output_value
语句,这样如果你的函数没有返回期望的tested_output_value
.
例如,如果您想测试您的函数,predict
一种方法是编写一个请求您的本地主机服务器的函数并验证响应是否符合您的预期。注意:在运行 pytest 之前,请确保您已经启动了服务器;)
推荐阅读
- python - 优化 OpenCV 蒙版边缘
- json - Angular 6 错误处理 - HttpErrorResponse 具有未定义的状态
- symfony - 无法在 Symfony 中向模型添加字段,bin/console 崩溃
- semaphore - signal() 和 wait() 在信号量算法中做吗?
- python - python + google sheet == gspread,但遗憾的是AttributeError:类型对象'ServiceAccountCredentials'没有属性'from_json_keyfile'
- r - 在 Shinyapps 上运行应用程序的问题(传单地图贴错标签)
- swift - UIButton 调整大小以适应 UIImage
- python - 如何解码 LTTextLine.get_text() 的输出?
- graph - 为什么我的 Gremlin 查询会导致这么多请求?这是正确的行为吗?
- python - 获取请求 - Python 循环