1、充值接口
首先,我们得去写测试用例,以下仅仅几条,不算完善,仅仅是想跑起来,测一次,你们可自行设计更加全面完善的用例,那么这个expected结果是需要自己在postman上面自己先测一遍,看返回的是什么东西
postman截图:
在代码中实现:
import unittest
import os
import requests
from common.handle_config import conf
from common.handle_database import db
from common.handle_excel import Excel
from common.handle_log import log
from common.handle_path import DATA_DIR
from common import myddt
from jsonpath import jsonpath
@myddt.ddt
class TestReCharge(unittest.TestCase):
excel = Excel(os.path.join(DATA_DIR, "cases.xlsx"), "recharge")
cases = excel.read_data()
@classmethod
def setUpClass(cls):
"""写该用例类执行之前的前置,先登录才有后续的充值操作"""
"""登录获取token,用户id"""
# 这就涉及到两个接口之间的参数依赖,比如登录接口和充值接口,参数依赖就是token和用户id
login_url = conf.get("env", "login_url")
params = {
"mobile_phone": conf.get("login_test_data", "mobile_phone"),
"pwd": conf.get("login_test_data", "pwd")
}
headers = eval(conf.get("env", "headers"))
response = requests.request(url=login_url, method="post", json=params, headers=headers)
res_login = response.json()
# 提取token
token = jsonpath(res_login, "$..token")[0]
cls.token = "Bearer" + " " + token
# 提取用户id
cls.member_id = jsonpath(res_login, "$..id")[0]
@myddt.data(*cases)
def test_recharge(self, item):
# 第一步:准备数据
# 接口地址
url = conf.get("env", "base_url") + item["url"]
# 请求参数
if "#member_id#" in item["data"]:
item["data"] = item["data"].replace("#member_id#", str(self.member_id))
params = eval(item["data"])
# 请求头
headers = eval(conf.get("env", "headers"))
# 请求头中添加token
headers["Authorization"] = self.token
# 需要鉴权
# 请求方法
method = item["method"]
# 预期结果
expected = eval(item["expected"])
sql = item["check_sql"]
# 请求之前的金额
if sql:
s_amount = db.find_data(sql.format(params["member_id"]))
s_money = s_amount[0]["leave_amount"]
# 第二步:请求接口,获取结果
response = requests.request(url=url, method=method, json=params, headers=headers)
res = response.json()
print("预期结果:", expected)
print("实际结果:", res)
# 断言
try:
self.assertEqual(expected["code"], res["code"])
self.assertEqual(expected["msg"], res["msg"])
# 数据库校验
if sql:
# 请求之后的金额
e_amount = db.find_data(sql.format(params["member_id"]))
e_money = e_amount[0]["leave_amount"]
self.assertEqual(float(e_money - s_money), params["amount"])
except AssertionError as e:
log.error("用例{},执行未通过".format(item["title"]))
log.exception(e)
raise e
else:
log.info("用例{},执行通过".format(item["title"]))
很容易遇到的一些坑
坑一:
这个是涉及到Decimal类型数据的校验,可以将decimal类型的数据转换为浮点数
坑二:
涉及到局部变量和全局变量
正确的代码应该是这样:
坑三:
这个是报错,布尔值无法进行切片操作,说明返回的对象不是token,而是False,那就说明取不到token,取不到token的原因,再往上推测,那就是登录没成功,失败了。
登录失败,为什么会登录失败,说明有以下几种情形:请求路径、请求参数、请求头、请求方式,涉及到这四个,需要靠自己逐一排查,像这个问题就是路径错了
2、取现接口
同样的,先设计测试用例…此处省略一万字
再上代码:
import unittest
import os
import requests
from common.handle_config import conf
from common.handle_database import db
from common.handle_excel import Excel
from common.handle_log import log
from common.handle_path import DATA_DIR
from common import myddt
from jsonpath import jsonpath
@myddt.ddt
class TestWithdraw(unittest.TestCase):
excel = Excel(os.path.join(DATA_DIR, "cases.xlsx"), "withdraw")
cases = excel.read_data()
@classmethod
def setUpClass(cls):
"""写该用例类执行之前的前置,先登录才有后续的充值操作"""
"""登录获取token,用户id"""
# 这就涉及到两个接口之间的参数依赖,比如登录接口和充值接口,参数依赖就是token和用户id
login_url = conf.get("env", "login_url")
params = {
"mobile_phone": conf.get("login_test_data", "mobile_phone"),
"pwd": conf.get("login_test_data", "pwd")
}
headers = eval(conf.get("env", "headers"))
response = requests.request(url=login_url, method="post", json=params, headers=headers)
res_login = response.json()
# 提取token
token = jsonpath(res_login, "$..token")[0]
cls.token = "Bearer" + " " + token
# 提取用户id
cls.member_id = jsonpath(res_login, "$..id")[0]
@myddt.data(*cases)
def test_withdraw(self, item):
# 第一步:准备数据
# 接口地址
url = conf.get("env", "base_url") + item["url"]
# 请求参数
if "#member_id#" in item["data"]:
item["data"] = item["data"].replace("#member_id#", str(self.member_id))
params = eval(item["data"])
# 请求头
headers = eval(conf.get("env", "headers"))
# 请求头中添加token
headers["Authorization"] = self.token
# 需要鉴权
# 请求方法
method = item["method"]
# 预期结果
expected = eval(item["expected"])
sql = item["check_sql"]
# 请求之前的金额
if sql:
s_amount = db.find_data(sql.format(params["member_id"]))
s_money = s_amount[0]["leave_amount"]
# 第二步:请求接口,获取结果
response = requests.request(url=url, method=method, json=params, headers=headers)
res = response.json()
print("预期结果:", expected)
print("实际结果:", res)
# 断言
try:
self.assertEqual(expected["code"], res["code"])
self.assertEqual(expected["msg"], res["msg"])
# 数据库校验
if sql:
# 请求之后的金额
e_amount = db.find_data(sql.format(params["member_id"]))
e_money = e_amount[0]["leave_amount"]
self.assertEqual(float(s_money - e_money), params["amount"])
except AssertionError as e:
log.error("用例{},执行未通过".format(item["title"]))
log.exception(e)
raise e
else:
log.info("用例{},执行通过".format(item["title"]))
提现的代码基本和充值一样,但是除了命名改一下,目前只需改这一行代码即可,附上运行结果截图
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
没有什么事情是轻而易举的,只有不停地学习、不断地探索和付出,才能取得成功。坚持自己的信念,努力追求梦想,终将收获无尽的喜悦和真正的幸福!
在漫漫人生路上,不论遇到多少困难和挑战,都要保持坚定的信念和无限的勇气。相信自己的潜力,敢于追求,努力奋斗,你将点亮属于自己的璀璨星途!
不要让过去的失败束缚你,也不要让未来的担忧打消你的勇气。用每一次努力和坚持,书写出属于自己的辉煌篇章,成就那个无限可能的你!