实现接口关联(审核接口)
依赖接口:登录接口(管理员账号),创建项目接口(得到项目id) ,项目接口也需要登录接口(普通用户账号member_id)
流程:访问登录接口(获得普通用户id,普通用户token)--> 访问创建项目接口(需要普通用户token,获得项目id)-->访问登录接口(获得管理员id,管理员token)-->访问审核接口(需要管理员token,项目id)
操作步骤:
-在接口类中添加管理员登录的类方法,并且得到管理员id和token
因为需要获得登录2个人的账号信息,如果用同一个登录方法,会导致类属性被覆盖
而且管理员登录的方法,定义属性的时候属性名不能相同,会导致属性被覆盖
@classmethod
def admin_login(cls):
# 访问登录接口
login_resp = requests.request(url=f"{host}/member/login", method="post",
headers={"X-Lemonban-Media-Type": "lemonban.v2"},
json=admin_user)
login_data = login_resp.json()
cls.admin_member_id = str(jsonpath(login_data, "$..id")[0])
cls.admin_token = jsonpath(login_data, "$..token")[0]
cls.admin_leave_amount = jsonpath(login_data, "$..leave_amount")[0]
return (cls.admin_member_id, cls.admin_token, cls.admin_leave_amount)
-在接口类中添加新增项目接口函数
访问添加项目接口前,需要先访问登录接口获得id和token
@classmethod
def add_project(cls):
json_data = json.loads(info["json"])
title = json_data["title"]
amount = json_data["amount"]
loan_rate = json_data["loan_rate"]
loan_term = json_data["loan_term"]
loan_date_type = json_data["loan_date_type"]
bidding_days = json_data["bidding_days"]
#续要先访问登录接口获取id和token
data = {"member_id": cls.member_id,"title": title,"amount": amount,
"loan_rate": loan_rate,"loan_term": loan_term,
"loan_date_type": loan_date_type,"bidding_days": bidding_days}
add_project_resp = requests.request(url=f"{host}/loan/add", method="post",
headers={"X-Lemonban-Media-Type": "lemonban.v2","Authorization": cls.token},
json=data)
add_project_data = add_project_resp.json()
cls.loan_id = str(jsonpath(add_project_data,"$..id")[0])
-在前置条件中,调用登录接口和新增项目接口函数
-setUpClass
普通用户登录和管理员登录,只需要访问一次登录接口,就能获得id和token
@classmethod
def setUpClass(cls) -> None:
#测试用例需要的前置,每个类只执行一次
#访问普通用户登录接口,得到id,token
cls.login()
#访问管理员登录接口,得到id,token
cls.admin_login()
-setUp
访问新增项目接口,需要每次执行用例都新增一次,放到类前置的话,一个测试用例类只能新增一次,审核已经存在的项目会导致测试不通过
def setUp(self) -> None:
#访问添加接口,每次都需要创建一个新的项目
self.add_project()
-获取请求头和token信息
@data(*info)
def test_recharge_01(self,case_info):
# 获得普通用户token
headers = case_info["headers"]
if "#token#" in headers:
headers = headers.replace("#token#",self.token)
elif "#admin_token#" in headers:
headers = headers.replace("#admin_token#", self.admin_token)
my_log.info(f"写入请求头参数{headers}")
#3,id添加到请求数据当中
json_data = case_info["json"]
if "#loan_id#" in json_data:
json_data = json_data.replace("#loan_id#",self.loan_id)
测试时候考虑到普通用户访问审核接口,所以用到if..elif..语句,能实现普通用户和管理员的token
-访问审核接口
#访问审核接口
json_data = json.loads(json_data)
headers = json.loads(headers)
expected = json.loads(case_info["expected"])
my_log.info(f"正在测试审核接口:{case_info['title']}")
autid_resp = requests.request(method=case_info["method"],url=host + case_info['url'],
headers=headers,json=json_data).json()
-断言
for key,value in expected.items():
self.assertEqual(value,autid_resp[key])
完成流程
import unittest
import requests
from config.config import case_file,host,log_1_file
from common.excel_handle import ExcelHandle
from ddt import ddt,data
from common.get_logging import get_log
import json
from common.api_case import APICase
info = ExcelHandle(case_file,"audit").read_excel()[1:]
my_log = get_log(log_1_file,name="conlin")
@ddt
class TestAudit(unittest.TestCase,APICase):
@classmethod
def setUpClass(cls) -> None:
#测试用例需要的前置,每个类只执行一次
#访问普通用户登录接口,得到id,token
my_log.info("开始测试")
cls.login()
my_log.info("普通用户登录")
#访问管理员登录接口,得到id,token
cls.admin_login()
my_log.info("管理员登录")
my_log.info("*"*100)
def setUp(self) -> None:
#访问添加接口,每次都需要创建一个新的项目
self.add_project()
my_log.info("新增项目")
my_log.info("*"*60)
@classmethod
def tearDownClass(cls) -> None:
#后置操作:每个测试类只执行一次
pass
@data(*info)
def test_recharge_01(self,case_info):
# 获得普通用户token
headers = case_info["headers"]
if "#token#" in headers:
headers = headers.replace("#token#",self.token)
elif "#admin_token#" in headers:
headers = headers.replace("#admin_token#", self.admin_token)
my_log.info(f"写入请求头参数{headers}")
#3,id添加到请求数据当中
json_data = case_info["json"]
if "#loan_id#" in json_data:
json_data = json_data.replace("#loan_id#",self.loan_id)
#访问审核接口
json_data = json.loads(json_data)
headers = json.loads(headers)
expected = json.loads(case_info["expected"])
my_log.info(f"正在测试审核接口:{case_info['title']}")
autid_resp = requests.request(method=case_info["method"],url=host + case_info['url'],
headers=headers,json=json_data).json()
try:
for key,value in expected.items():
self.assertEqual(value,autid_resp[key])
my_log.info("用例通过")
except AssertionError as e:
my_log.error("用例不通过")
ExcelHandle(case_file, "audit").write_excel(row=case_info["case_id"] + 1, column=9, value="用例不通过")
raise e
else:
ExcelHandle(case_file,"audit").write_excel(row=case_info["case_id"]+1,column=9,value="用例通过")
finally:
my_log.info("*"*60)
测试用例函数需要编写的代码
1,获取实际结果
2,获取预期结果
3,断言
除了这3个操作,都是可以作为前置或者后置