欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python接口自动化

程序员文章站 2022-05-23 15:18:41
...

最近看了些接口自动化,网上资料很多,也都大同小异,也总结下,方便后续的复习。

采用的是unittest测试框架,目录上由以下几个部分组成:

python接口自动化

按模块说下各自的作用:

1、API层:封装所有接口的请求,并将响应结果返回

import requests

class DetailApi(object):
    def api_detail(self,url,lng,activityId,lat,channel,token):
        headers = {"Content-Type": "application/x-www-form-urlencoded", "partner": "k",  "token":token,"channel": channel}
        data = {"lng": lng, "activityId": activityId, "lat": lat, "token":token }
        r = requests.put(url, headers=headers, json=data)
        print(r.status_code)
        return r

2、case层:一个接口定义一个用例文件,一个接口会有多个用例。采用数据驱动的方式,比如将不同用例的入参放到一个json文件里,通过数据处理,将这些参数转换为一个元组列表,再通过parameterized装饰器,来生成多个新的测试方法(例如 test1()、test2()……),并将参数依次赋值给它们。

#-- coding:UTF-8 --
import unittest
from api_weiliao.detail_post_api import DetailApi
from tools.read_json import ReadJson
from parameterized import parameterized

# 读取数据函数
def get_data():
    datas = ReadJson("detail.json").read_json()
    # 新建空列表,添加读取json数据
    arrs = []
    # 使用遍历获取所有的value
    for data in datas.values():
        arrs.append((data.get("url"),
                     data.get("lng"),
                     data.get("activityId"),
                     data.get("lat"),
                     data.get("channel"),
                     data.get("token"),
                     data.get("code"),
                     data.get("check_data"),
                     data.get("except_check_data"),
                     data.get("assert_methos"),
                     data.get("status_code")))
    return arrs
class TestDetail(unittest.TestCase):
    @parameterized.expand(get_data())
    def test_01_detail(self, url, lng, activityId, lat, channel, token, code, check_data, except_check_data, assert_methos, status_code):

        r= DetailApi().api_detail(url, lng, activityId, lat, channel, token)
        #print(r.json()['data'][check_data])
        self.assertEqual(code, r.json()['code'])
        if assert_methos=='in':
            self.assertIn(r.json()['data'][check_data], except_check_data)
            print('check_data', check_data)
        elif assert_methos=='equal':
            print('check_data', check_data)
            self.assertEqual(r.json()['data'][check_data], except_check_data)
        elif assert_methos=='notNULL':

            #print ( type(check_data))
            if isinstance(check_data, list):
                for c in check_data:
                    self.assertIsNotNone(r.json()['data'][c], "校验字段出现了为null的情况,可能接口出现了问题")
                    print (r.json()['data'][c])
        else:
            print('请配置对应的断言方式')



3、json参数数据层:每个接口所有的用例参数都放到一个json文件里。

{
  "detail_001":{
                "url":"https:activity/detail",
               "lng":1041 ,
               "activityId":80,
               "lat": 22.332,
               "token":"U34",
               "channel": "",
                "code": 200,
                "check_data": "subse",
                "except_check_data": [0,1],
                "assert_methos": "in",
                "status_code": 200},
"detail_002":{
                "url":"https:activity/detail",
               "lng":1041 ,
               "activityId":80,
               "lat": 22.332,
               "token":"U34",
               "channel": "",
                "code": 200,
                "check_data": "subse",
                "except_check_data": 1,
                "assert_methos": "equal",
                "status_code": 200},

}

4、report测试报告:每次执行后的测试报告都放在这里

5、tools层:工具类都放在这里,比如对json文件的数据处理等

#-- coding:UTF-8 --
# 导包 json
import json

# 打开josn文件并获取文件流
# with open("../data/login.json", "r", encoding="utf-8") as f:
#     # 调用load方法加载文件流
#     data = json.load(f)
#     print("获取的数据为:", data)

# 使用函数进行封装
# def read_json():
#     with open("../data/login.json", "r", encoding="utf-8") as f:
#         # 调用load方法加载文件流
#         return json.load(f)


# 使用参数替换 静态文件名

class ReadJson(object):

    def __init__(self, filename):
        self.filepath = "../fvb/" + filename

    def read_json(self):
        with open(self.filepath, "r") as f:
            # 调用load方法加载文件流
            return json.load(f)



"""
    问题:
        1. 未经过封装无法在别的模块内使用。
        2. 数据存储文件有好几个,如果写次,在读取别的文件时无法使用
        3. 预期格式为列表嵌套元祖 [(url,mobile,code...)],目前返回字典?
    解决:
        1. 进行封装
        2. 使用参数替换静态写死的文件名
        3. 读取字典内容,并添加到新的列表中。
"""

if __name__ == '__main__':
    # print(ReadJson("login.json").read_json())


    # 登录数据调试
    # data = ReadJson("login.json").read_json()
    # 新建空列表,添加读取json数据
    # arrs = []
    # arrs.append((data.get("url"),
    #              data.get("mobile"),
    #              data.get("code"),
    #              data.get("expect_result"),
    #              data.get("status_code")))
    # print(arrs)


    # 获取用户频道列表 调试
    # data = ReadJson("channel.json").read_json()
    # # 新建空列表,添加读取json数据
    # arrs = []
    # arrs.append((data.get("url"),
    #              data.get("headers"),
    #              data.get("expect_result"),
    #              data.get("status_code")))
    # print(arrs)

    # 获取收藏文章 调试
    # data = ReadJson("article_add.json").read_json()
    # # 新建空列表,添加读取json数据
    # arrs = []
    # arrs.append((data.get("url"),
    #              data.get("headers"),
    #              data.get("data"),
    #              data.get("expect_result"),
    #              data.get("status_code")))
    # print(arrs)

    # 获取取消收藏文章 调试
    data = ReadJson("article_cancel.json").read_json()
    # 新建空列表,添加读取json数据
    arrs = []
    arrs.append((data.get("url"),
                 data.get("headers"),
                 data.get("status_code")))
    print(arrs)


6、用例执行文件

#-- coding:UTF-8 --
# 导包 unittest HTMLTestRunner time
import unittest
import time
from tools.HTMLTestRunner import HTMLTestRunner


# 第一步:组装测试套件
suite = unittest.defaultTestLoader.discover("./case",pattern="test*.py")

# 第二步:指定报告存放路径及文件名称
file_path = "./report/{}.html".format(time.strftime("%Y_%m_%d %H_%M_%S"))

# 第三步:运行测试套件并生成测试报告
with open(file_path, "wb") as f:
    HTMLTestRunner(stream=f).run(suite)

 

相关标签: 自动化测试