python接口自动化
程序员文章站
2022-05-23 15:18:41
...
最近看了些接口自动化,网上资料很多,也都大同小异,也总结下,方便后续的复习。
采用的是unittest测试框架,目录上由以下几个部分组成:
按模块说下各自的作用:
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)