新增测试用例后端逻辑
1. 新增do层的testcase_entity.py 实体类
from server import db
class TestcaseEntity(db.Model):
# 表名字
__tablename__ = "testcase"
# 用例ID,主键
id = db.Column(db.Integer, primary_key=True)
# 用例标题,唯一
title = db.Column(db.String(64), nullable=True, unique=True)
# 用例等级,不为空
level = db.Column(db.String(16), nullable=True)
# 用例步骤,可以重复
step = db.Column(db.String(128), nullable=True)
# 预期结果
expect = db.Column(db.String(64), nullable=True)
# 返回结果为字段类型
def as_testcase_entity_dict(self):
return {"id": self.id, "title": self.title, "level": self.level, "step": self.step, "expect": self.expect}
2. 新增dao层的testcase_dao.py
(dao层class类继承do层类)
from server import db
from util.log_util import Log
from do import TestcaseEntity
"""继承testcaseEntity类"""
class TestcaseDAO(TestcaseEntity):
log = Log()
def get_testcase(self,id):
"""
查询测试用例
:return:
"""
case_info = TestcaseDAO.query.filter_by(id=id).first()
self.log.info(f"查询单个测试用例的结果:{case_info}")
return case_info
def get_all_testcase(self):
"""
查询所有测试用例
:return:
"""
case_info = TestcaseDAO.query.all()
self.log.info(f"查询所有测试用例的结果:{case_info}")
return case_info
def add_testcase(self,TestcaseEntity):
"""新增测试用例"""
db.session.add(TestcaseEntity)
db.session.commit()
self.log.info(f"新增的测试用例为:{TestcaseEntity}")
return TestcaseEntity.id
def delete_testcase(self,id):
"""
删除测试用例
:param id:
:return:
"""
case_info = TestcaseDAO.query.filter_by(id=id).first()
self.log.info(f"删除的测试用例为:{id}")
db.session.delete(case_info)
db.session.commit()
def update_testcase(self,TestcaseEntity):
"""
更新测试用例
:param TestcaseEntity:
:return:
"""
case_info = TestcaseDAO.query.filter_by(id=TestcaseEntity.id).first()
case_info.title = TestcaseEntity.title
case_info.step = TestcaseEntity.step
case_info.level = TestcaseEntity.level
case_info.expect = TestcaseEntity.expect
db.session.commit()
self.log.info(f"更新的测试用例为:{TestcaseEntity}")
return TestcaseEntity.id
3. 新增service层testcase_serivice.py 逻辑
from dao.testcase_dao import TestcaseDAO
from util.log_util import Log
class TestcaseService:
def __init__(self):
self.testcase_dao = TestcaseDAO()
self.log = Log()
def get_filter_testcase(self,id):
"""
查询过滤的测试用例
:param id:
:return:
"""
res = self.testcase_dao.get_testcase(id) # 调用DAO层
if res:
return res
else:
self.log.info("未查询到当前测试用例")
return False
def get_all_testcase(self):
"""
查询所有测试用例
:return:
"""
res = self.testcase_dao.get_all_testcase()
if res:
return res
else:
self.log.info("未查询到所有测试用例")
return False
def create_testcase(self,TestcaseDAO):
"""
创建测试用例
:param TestcaseDAO:
:return:
"""
res = self.testcase_dao.get_testcase(TestcaseDAO.id)
if res:
self.log.info("测试用例已存在,无法新增")
return False
else:
return self.testcase_dao.add_testcase(TestcaseDAO)
def delete_testcase(self,id):
"""
删除测试用例
:param id:
:return:
"""
res = self.testcase_dao.get_testcase(id)
if res:
self.testcase_dao.delete_testcase(id)
self.log.info(f"删除的用例为:{res}")
return res
else:
self.log.info(f"测试用例不存在,无法删除")
return False
def update_testcase(self, TestcaseDAO):
"""
更新测试用例
:param TestcaseDAO:
:return:
"""
res = self.testcase_dao.get_testcase(TestcaseDAO.id)
if res:
return self.testcase_dao.update_testcase(TestcaseDAO)
else:
self.log.info("修改的测试用例不存在")
return False
4. 新增controller层的testcase_controller.py 逻辑
from flask import request, jsonify
from flask_restx import Resource, Namespace
from dao.testcase_dao import TestcaseDAO
from util.log_util import Log
from server import api
from service.testcase_service import TestcaseService
log = Log()
testcase_service = TestcaseService()
testcase_ns = Namespace("testcase", description="测试用例管理")
@testcase_ns.route("")
class TestcaseController(Resource):
get_parser = api.parser()
get_parser.add_argument("id", type=int, location="args")
@testcase_ns.doc(description='用例查询接口')
@testcase_ns.expect(get_parser)
def get(self):
"""
查询单个/多个
:return:
"""
case_id = request.args.get("id")
log.info(f"接受的前端参数为:<========={case_id}")
# 传参数,查询单个
if case_id:
res = testcase_service.get_filter_testcase(case_id)
# 查询存在的ID用例
if res:
datas = [testcase_service.get_filter_testcase(case_id).as_testcase_entity_dict()]
log.info(f"debug=>>>>>>>>>>>>{datas}")
return jsonify({"code":0, "msg":"search testcase success","data":datas})
# 查询不存在的ID用例
else:
return jsonify({"code": 0, "msg": "search testcase success", "data": res})
else:
# 不传参数查询所有
datas = testcase_service.get_all_testcase()
all_datas = [data.as_testcase_entity_dict() for data in datas]
return jsonify({"code":0, "msg":"search all testcase success","data":all_datas})
put_parser = api.parser() # 添加如下参数:参数以及类型和对象
put_parser.add_argument("id", type=int, required=True, location="json")
put_parser.add_argument("title", type=str, required=True, location="json")
put_parser.add_argument("level", type=str, required=True, location="json")
put_parser.add_argument("step", type=str, required=True, location="json")
put_parser.add_argument("expect", type=str, required=True, location="json")
@testcase_ns.doc(description='用例修改接口')
@testcase_ns.expect(put_parser)
def put(self):
testcase_data = request.json
log.info(f"接收更新测试用例的参数<========{testcase_data}")
testcase_dao = TestcaseDAO(**testcase_data)
res = testcase_service.update_testcase(testcase_dao)
if res:
return jsonify({"code":0, "msg":"update testcase success", "data":res})
else:
return jsonify({"code":40001, "msg":"update testcase fail", "data":res})
post_parser = api.parser() # 添加如下参数:参数以及类型和对象
post_parser.add_argument("id", type=int, required=True, location="json")
post_parser.add_argument("title", type=str, required=True, location="json")
post_parser.add_argument("level", type=str, required=True, location="json")
post_parser.add_argument("step", type=str, required=True, location="json")
post_parser.add_argument("expect", type=str, required=True, location="json")
@testcase_ns.doc(description='用例新增接口')
@testcase_ns.expect(post_parser)
def post(self):
testcase_data = request.json
log.info(f"接收新增测试用例的参数<========{testcase_data}")
testcase_dao = TestcaseDAO(**testcase_data)
res = testcase_service.create_testcase(testcase_dao)
if res:
return jsonify({"code":0, "msg":"create testcase success", "data":res})
else:
return jsonify({"code":40001, "msg":"create testcase fail", "data":res})
delete_parser = api.parser()
delete_parser.add_argument("id", type=int, required=True, location="json")
@testcase_ns.doc(description='用例删除接口')
@testcase_ns.expect(delete_parser)
def delete(self):
case_id = request.json.get("id")
log.info(f"接收删除测试用例的参数<========{case_id}")
if case_id:
testcase_service.delete_testcase(case_id)
return jsonify({"code":0, "msg":"delete testcase success","data":case_id})
else:
return jsonify({"code":40001, "msg":"delete testcase fail","data":case_id})
5. 新增server启动类的接口命名空间
def add_router():
from controller.user_controller import user_ns
from controller.login_controller import login_ns
from controller.register_controller import register_ns
from controller.testcase_controller import testcase_ns
api.add_namespace(user_ns,"/user") # 添加api的命名空间,解决swagger不展示内容的问题
api.add_namespace(login_ns, "/login")
api.add_namespace(register_ns, "/register")
api.add_namespace(testcase_ns, "/testcase")
if __name__ == "__main__":
add_router()
app.run(debug=True)
6. 在swagger接口进行接口测试
-
新增接口测试
mysql数据已新增成功
-
查询结果测试
- 查询单个
-
查询所有
-
查询不存在
-
更新测试用例
验证DB是否一致成功
-
删除测试用例
验证删除是否成功