python 接口自动化 - 面向对象思想对 Restful 类型的请求进行二次封装 - 写用例
项目目录结构:
├─api
├─core
└─testcase
- api : 封装 python 接口
- core:封装 Restful 类型的请求
- testcase : 编写用例
根据 Requests 的源码进行二次封装
core/rest_client.py
import requests
class RestClient(object):
def __init__(self, KeepLogin, api_root_url):
self.KeepLogin = KeepLogin
self.api_root_url = api_root_url
def get(self, url, **kwargs):
return self.request(url, "GET", **kwargs)
def post(self, url, data = None, json = None, **kwargs):
return self.request(url, "POST", data, json, **kwargs)
def request(self, url, method, data = None, json = None, **kwargs):
url = self.api_root_url + url
if method == "GET":
return self.KeepLogin.get(url, **kwargs)
if method == "POST":
return self.KeepLogin.post(url, data, json, **kwargs)
封装 python 接口
/api/schoolManageApi.py
from core.rest_client import RestClient
class SchoolManage(RestClient):
def __init__(self, KeepLogin, api_root_url):
super(SchoolManage, self).__init__(KeepLogin, api_root_url)
def school_login(self, **kwargs):
return self.get("/login/in", **kwargs)
def school_add(self, **kwargs):
return self.post("/school/manage/addSchoolInfo", **kwargs)
写测试用例
/testcase/testSmsCase.py
import random
import unittest
import requests
from api.schoolManageApi import SchoolManage
Userdict = {
"account": "admin",
"pwd": "660B8D2D5359FF6F94F8D3345698F88C"
}
Userdict_error = {
"account": "admin",
"pwd": "1660B8D2D5359FF6F94F8D3345698F88C"
}
class SMSLoginAndSchoolAdd(unittest.TestCase):
@classmethod
def setUpClass(self):
self.s = requests.session()
self.url = "http://192.168.139.128:8080/recruit.students"
self.KeepLogin = SchoolManage(self.s, self.url)
self.KeepLogin.school_login(params=Userdict)
@classmethod
def tearDownClass(self):
self.s.close()
def test_01(self):
print("测试用例01:正确用户名与密码,登陆成功")
a = self.KeepLogin.school_login(params=Userdict)
self.assertIn("退出", a.text)
print("测试用例01通过")
# def test_02(self):
# print("测试用例02:正确用户名与错误密码,登陆失败")
# a = self.KeepLogin.get("/login/in", Userdict_error)
# self.assertNotIn("退出", a.text)
# print("测试用例02通过")
def test_03(self):
print("测试用例03:在登陆状态下成功添加任意学校")
# 一个随机学校名和一个随机备注
SchoolNameRandom = random.randint(1, 1000000000)
RemarkRandom = random.randint(1, 100000)
# 新建学校post请求的body参数
SchoolAddBody = {
"schoolName": SchoolNameRandom,
"listSchoolType[0].id": 2,
"canRecruit": 1,
"remark": RemarkRandom
}
a = self.KeepLogin.school_add(data=SchoolAddBody)
print(a.text)
# a.post("/school/manage/addSchoolInfo", data=SchoolAddBody)
if __name__ == "__main__":
unittest.main()
后续还可以进行关键字的封装
现在在写用例的时候,还存在重复调用的地方
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-12-23 十七、JMeter实战-乱码解决方法
2020-12-23 十六、JMeter实战-跨线程调用token