python request接口测试笔记(1)

python request接口测试笔记(1)

涉及到的功能说明:

  1. 需要登录拿到token,才能进行下一个接口的请求
  2. 读取csv文件中的信息,作为接口的参数
  3. 将接口响应结果,写入csv文件,以便分析统计
# -*- coding:utf-8 -*-
'''
author:***cy
time:2019-08-28
主要功能说明:
1、获取登录接口的token
2、接入食物识别的接口,批量测试食物识别模型,得出模型的正确率
'''
import requests
import json
import csv

class FoodDetect():



    def __init__(self):
        print("----------------start----------------")

    '''获取token'''
    def login_token(self):

        # 初始化登录接口
        login_url = 'https://api.ty.com/oauth2/token?grant_type=password&sms_verify=true'
        login_header = {"Authorization": "Basic T23DZZMfrrdFrTfdfR4esdFGrfrdfOjdmTFJyEmFmYzgxRDgwSfdfR="}
        login_data = {
            "username": "15012345678",
            "password": "123456",
            "appName": "ty",
            "grant_type": "password",
            "sms_verify": "true"
        }
        # 登录请求接口
        r_login = requests.post(url=login_url, data=login_data, headers=login_header)

        # 获取登录的响应报文
        print(r_login.text)
        # login_response = json.loads(r_login.text)
        # 保存登录的token信息
        # access_token = login_response['access_token']
        token = r_login.json()['access_token']
        print(token)
        '''请求接口获取token值'''
        return token


    def detect_food(self):

        # 初始化
        food_flag_init = 0
        food_error_init = 0
        food_fail_init = 0

        # 读取csv文件
        with open('E:\\test\\ty\\food_detect_init.csv', 'r') as csvFile:
            reader = csv.reader(csvFile)
            print(type(reader))
            next(reader)
            for row in reader:
               
                # 食物识别问答接口的请求参数msg
                food_msg = {"msg": row[0]}
                print(food_msg)

                # 获取登录接口中的token
                food_headers = {"Authorization": "Bearer " + self.login_token()}
                # 食物识别接口url
                food_url = 'https://api.ty.com/nlp/api/v1.0/food_detect'
                # 食物识别模型接口请求
                r_food = requests.post(url=food_url, data=food_msg, headers=food_headers)
                # 获取响应报文
                print(r_food.text)
                # 转换响应结果为dict格式
                food_response = json.loads(r_food.text)
                

                # 判断响应结果是否为空,不为空,则获取cal_name和name的名称
                if food_response:
                    print(food_response[0])
                    food_response_all = food_response[0]
                    food_response_all_one = food_response_all['properties']
                    # 获取cal_name的值
                    food_response_cal = food_response_all_one['cal_name']
                    food_response_name = food_response_all_one['name']
                    print("food的calname:" + food_response_cal)
                    #food_response_name
                    if food_response_cal ==  row[0]:
                        # 如果calname和输入的食物名称一致,则测试通过,写入food_py_success文件
                        """
                        模型匹配的方法:先匹配name,然后和库里面的cal_name对比,这里需要修改一下判断条件
                        """

                        food_flag_init = food_flag_init + 1
                        print("food匹配成功%d" %food_flag_init)
                    else:
                        fail_data = ['food_name','name','cal_name']
                        food_fail_init = food_fail_init + 1
                        print("food匹配错误%d" %food_fail_init)
                        with open('E:\\test\\ty\\food_detect_fail.csv','a+',encoding='utf-8-sig') as ff:

                            fail_data[0] = row[0]
                            fail_data[1] = food_response_name
                            fail_data[2] = food_response_cal
                            ff.write(','.join(fail_data))
                            ff.write('\n')
                            ff.close()

                else:
                    food_error_init = food_error_init + 1
                    print("food匹配失败%d" % food_error_init)

                    # 将失败的食物name存在csv文件
                    error_data = ['name']
                    with open('E:\\test\\ty\\food_detect_error.csv','a+',encoding = 'utf-8-sig')as ef:
                        error_data[0] = row[0]
                        ef.write(','.join(error_data))
                        ef.write('\n')
                        ef.close()

                    # 写入csv文件
                data_row = ['food_real_name', 'food_response_name','food_response_cal']
                with open('E:\\test\\ty\\food_detect_py.csv','a+',encoding='utf-8-sig') as f:
                    # csv_write = csv.writer(f)
                    data_row[0] = row[0]
                    data_row[1] = food_response_name
                    data_row[2] = food_response_cal



                        # data_row = list(data_row)
                        # print(data_row)
                    f.write(','.join(data_row))
                    f.write("\n")
                    # f.write("\\n")
                    print("down")
                    f.close()

                    # 打印食物匹配结果
                    print("food匹配成功%d" % food_flag_init)
                    print("food匹配错误%d" % food_fail_init)
                    print("food匹配失败%d" % food_error_init)


        csvFile.close()



if __name__ == '__main__':
    fd = FoodDetect()
    fd.detect_food()

食物检测接口的响应结果格式如下:

[
    {
        "properties":{
            "cal_name":"苹果汁",
            "type":"food",
            "index":4,
            "food_id":4342,
            "kcal_unit_weight":53.56,
            "name":"苹果汁",
            "start_index":0,
            "time_stamp":1567226386
        },
        "sub_properties":{
            "grams":543,
            "is_default":true,
            "quantifier_id":54,
            "quantity":1,
            "unit":"瓶"
        },
        "type":"Entity"
    }
]

所以这里想要获取响应结果中的cal_name,需要先获取properties,代码如下:

food_response_all = food_response[0]
food_response_all_one = food_response_all['properties']
# 获取cal_name的值
food_response_cal = food_response_all_one['cal_name']

整体下来,批量测试接口模型的工作就是这样,其中将接口返回结果写入csv时,需要注意要换行写入,而且使用写入的格式是'a'或'a+'追加模式。

posted @ 2019-08-31 13:58  janehost  阅读(542)  评论(0编辑  收藏  举报