接口自动化脚本设计规范

helStrive / 2024-09-27 / 原文

一、概述
接口自动化测试是软件开发过程中的重要环节,旨在验证不同模块之间或者系统与外部系统之间的数据交换是否符合预期。编写高效、稳定且易于维护的接口自动化脚本对于提升测试效率和产品质量具有重要意义。以下为一套通用的接口自动化脚本设计规范:

二、设计原则

  1. 模块化设计:将脚本按照业务功能进行模块划分,每个模块对应一组相关的接口测试用例,便于代码复用和管理。
  2. 结构清晰:使用良好的编程习惯,保证脚本结构清晰,注释详尽,以便于其他团队成员理解和维护。
  3. 独立性:脚本应具备较好的独立运行能力,尽量减少对环境和其他脚本的依赖。
  4. 可配置性:接口地址、请求参数等信息应通过配置文件或变量来获取,以适应不同的测试环境和场景。
  5. 异常处理:充分考虑各种可能的异常情况并做好错误处理,确保脚本在遇到问题时能够给出明确的错误信息,而不是直接中断执行。

三、具体规范

  1. 结构组织
    ● common: 存放一些公共方法
    ● conf: 配置文件
    ● report: 测试报告文件夹
    ● testcase: 测试用例文件夹
    ● run.py: 执行脚本
  2. 测试框架选择
    ● Python 的 requests + unittest
  3. 请求构造
    ● 明确定义并记录每个接口的请求方法(GET, POST, PUT, DELETE 等)、URL 及其参数。
    ● 使用参数化方式传入请求体和 URL 参数,避免硬编码。
    ● 对于复杂的请求头和认证信息,同样需要妥善管理和封装。
    4.命名规范
    ● testcase命名采用test_+"接口名称"的方式命名,接口名称展示为驼峰式。如:test_getAllProject.py
  4. 响应验证
    ● 设计详细的断言来验证响应状态码、返回结果的关键字段及格式。
    ● 针对可能出现的多种响应结果,都要有相应的验证逻辑。
  5. 日志记录
    ● 脚本执行过程中应详细记录日志,包括请求信息、响应信息、断言结果等。
    ● 在出错时能输出足够的调试信息,方便定位问题。
  6. 版本控制与持续集成
    ● 将脚本纳入版本控制系统,具体版本控制见代码仓库中的README.md文件。

四、样例代码
"""
@File : test_GetAllProject1.py
@Project : CodeFit
@Time : 22/3/2024 17:20
@Author : *********
@Software : PyCharm Community Edition
"""
import unittest, os
from common.read_excel_over import Read
from common.handler_path import DATA_DIR
from common import myddt
from common.handler_log import log
from common.handler_cof import cfg
from usertools.request_main import RunMain
from testcase import fixture

@myddt.ddt
class TestGetAllProject(unittest.TestCase):
excel = Read(os.path.join(DATA_DIR, "testapi.xlsx"), "project")
data = excel.read_excel()

@classmethod
def setUpClass(cls):
    """登录获取token"""
    fixture.login_admin()

@myddt.data(*data)
def test_getallproject(self, case):
    # 从表格读出来的数据为str,用eval去掉
    params = eval(case["data"])
    url = cfg.get("env", "base_url") + case["url"]
    headers = eval(cfg.get("env", "headers"))
    # headers["Authorization"] = self.admin_token
    # headers["X-Token"] = self.admin_token
    expected = eval(case["expected"])
    method = case["method"]
    res = RunMain().run_main(url, method, headers, params)
    print("预期结果:{}".format(expected))
    print("实际结果:{}".format(res))
    try:
        self.assertEqual(expected['code'], res['code'])
        self.assertEqual(eval(expected['success']), res['success'])
    except AssertionError as e:
        log.error("用例 {} 执行失败,已写入日志".format(case['title']))
        self.excel.write_data(row=case["case_id"] + 1, column=8, value="失败")
        raise e
    else:
        log.info("用例 {} 执行成功,已写入日志".format(case["title"]))
        self.excel.write_data(row=case["case_id"] + 1, column=8, value="成功")