管理员登陆、普通用户登陆、添加项目、审核可以封装起来,后续测试用例类中会频繁调用,导致代码冗余。
# fixture
import requests
from jsonpath import jsonpath
from common.handle_conf import conf
class BaseTest:
@classmethod
def admin_login(cls):
'''---------------管理员登陆-----------------'''
# 1、准备登陆的数据
url = conf.get('env', 'base_url') + '/member/login'
params = {
"mobile_phone": conf.get("test_data", "admin_mobile"),
"ped": conf.get("test_data", "admin_pwd")
}
headers = eval(conf.get("env", "headers"))
# 2、请求登陆接口
response = requests.post(url=url, json=params, headers=headers)
res = response.json()
# 3、提取token,放到请求头中,给后面用例使用
admin_token = jsonpath(res, '$..token')[0]
headers['Authorization'] = 'Bearer ' + admin_token
cls.admin_headers = headers
# 4、提取用例id
cls.admin_member_id = jsonpath(res, '$..id')[0]
@classmethod
def user_login(cls):
'''---------------普通用户登陆-----------------'''
# 1、准备登陆的数据
params = {
"mobile_phone": conf.get("test_data", "mobile"),
"ped": conf.get("test_data", "pwd")
}
headers = eval(conf.get("env", "headers"))
# 2、请求登陆接口
response = requests.post(url=url, json=params, headers=headers)
res = response.json()
# 3、提取token,放到请求头中,给后面用例使用
token = jsonpath(res, '$..token')[0]
headers['Authorization'] = 'Bearer ' + token
cls.headers = headers
# 4、提取用例id
cls.member_id = jsonpath(res, '$..id')[0]
@classmethod
def add_project(cls):
'''---------------添加项目-----------------'''
url = conf.get('env', 'base_url') + '/loan/add'
params = {
"member_id": cls.member_id,
"title": "借钱实现财富自由",
"amount": 2000,
"loan_rate": 12.0,
"loan_data": 3,
"loan_term": 1,
"bidding_days": 5
}
# 第二步:请求添加项目的接口
response = requests.post(url=url, json=params, headers=cls.headers)
res = response.json()
# 第三步:提取项目id,保存为类属性
cls.loan_id = jsonpath(res, '$..id')[0]
@classmethod
def audit(cls):
'''---------------审核-----------------'''
url = conf.get('env', 'base_url') + '/loan/audit'
params = {
"loan_id": cls.loan_id,
"approved_or_not": True
}
expected = eval(item['expected'])
method = item['methond']
# 第二步:调用接口,获取实际结果
response = requests.request(method=method, url=url, json=params, headers=cls.admin_headers)
res = response.json()
投资接口用例的实现
前置操作:
1、普通用户登陆(类级别)
2、管理员登陆(类级别)
3、添加项目(类级别)
4、审核项目(类级别)
用例方法:
1、准备数据
2、发生请求
3、断言
数据校验:
用户表:用户的余额投资前后会变化(投资前-投资后投资金额)
流水记录表:投资成功会新增一条流水记录(投资后流水数量-投资前流水数量1)
投资表:投资成功会新增一条记录(投资后数量-投资前数量==1)
import unittest
import os
import requests
from unittestreport import ddt, list_data
from common.handle_excel import HandleExcel
from common.handle_path import DATA_DIR
from common.handle_conf import conf
from common.tools import replace_data
from common.handle_log import my_log
from common.handle_mysql import HandleDB
from testcases.fixture import BaseTest
@ddt
class TestInvest(unittest.TestCase, BaseTest):
excel = HandleExcel(os.path.join(DATA_DIR, ' apicase.xlsx', 'invest'))
cases = excel.read_data()
db = HandleDB()
@classmethod
def setUpClass(cls) -> None:
# 管理员登陆
cls.admin_login()
# 普通用户登陆
cls.user_login()
# 添加项目
cls.add_project
# 审核
cls.audit()
@list_data(cases)
def test_invest(self, item):
# 第一步:准备数据
url = conf.get('env', 'base_url') + item['url']
item['data'] = replace_data(item['data', TestInvest])
params = eval(item['data'])
expected = eval(item['expected'])
method = item['methond']
# 第二步:调用接口,获取实际结果
# 请求接口前,查询用户表的sql
sql1 = "select * leave_amount from futureloan.member where id='{}'".format(self.member_id)
# 投资记录
sql2 = "select count(*) from futureloan.invest where member_id='{}'".format(self.member_id)
# 流水记录
sql3 = "select count(*) from futureloan.financelog where pay_member_id='{}'".format(self.member_id)
s_amount = self.db.find_one(sql1)[0]
s_invest = self.db.find_one(sql2)
s_financelog = self.db.find_one(sql3)
response = requests.request(method=method, url=url, json=params, headers=self.headers)
res = response.json()
# 调用接口之后,查询数据库
e_amount = self.db.find_one(sql1)[0]
e_invest = self.db.find_one(sql2)
e_financelog = self.db.find_one(sql3)
if item['title'] == "审核通过" and res['msg'] == 'OK':
TestAudit.pass_loan_id = self.loan_id
# TestAudit.pass_loan_id = params['loan_id']
# 第三步:断言
try:
self.assertEqual(expected['code'], res['code'])
self.assertEqual(expected['msg'], res['msg'])
if item['check_sql']:
# 断言用户余额
self.assertEqual(params['amount'], float(s_amount-e_amount))
# 断言投资记录
self.assertEqual(1, e_invest-s_invest)
# 断言流水记录
self.assertEqual(1, e_financelog - s_financelog)
except AssertionError as e:
my_log.error("用例{}执行失败".format(item['title']))
my_log.exception(e)
raise e
else:
my_log.info("用例{}执行成功".format(item['title']))