首页 > 解决方案 > 如何为我的 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()

标签: pythonunit-testingflask

解决方案


首先,我推荐使用pytest

为了进行正确的单元测试,您的程序应拆分为最好只执行一项任务的简单函数。

由于您正在使用requests,您可能想要测试您的 HTTP 调用。测试它们的一个好方法是使用响应来模拟目标服务器或 API。

务实地,开始创建一个文件夹tests/并为每个类或每个函数创建一个文件,以你要测试的类或函数命名(像这样test_your_function.py)。test_在此文件中,为您的函数编写单元测试(即,一个以pytest将其标识为单元测试的函数开头)。每个单元测试都应该包含一个assert tested_output_value == expected_output_value语句,这样如果你的函数没有返回期望的tested_output_value.

例如,如果您想测试您的函数,predict一种方法是编写一个请求您的本地主机服务器的函数并验证响应是否符合您的预期。注意:在运行 pytest 之前,请确保您已经启动了服务器;)


推荐阅读