接口自动化测试这几年基本成了测试岗位的标配技能。它核心不是把接口请求发出去,而是围绕请求、断言、数据驱动、用例管理、报告输出和持续集成形成一套可复用的工程化能力。很多同学在网上找了一堆“接口自动化测试框架”的教程,下载下来要么跑不通,要么只能跑通一条用例,换一个项目就废了。这次我们换个思路,直接从框架核心技能入手,讲清楚接口自动化测试框架怎么搭建、怎么封装、怎么批量跑用例、怎么出报告,顺便把 Python 和 Java 两条技术路线都对照一下。
这篇文章不是某个开源仓库的测评,而是一套可以落地到你自己项目的通用实践。核心内容基于“Python + requests + pytest + Allure”这条最常用的技术线,会给出完整的目录结构、封装思路、数据驱动写法、接口关联方案和 Jenkins 集成方式;同时对 Java 方向的 RestAssured + TestNG + Maven 也会做对比说明。你可以把它当成一份接口自动化测试框架搭建手册,遇到具体项目时替换掉地址、参数和业务逻辑即可。
1. 接口自动化测试框架核心能力速览
| 能力项 | 说明 |
|---|---|
| 框架类型 | 接口自动化测试框架,支持 HTTP/HTTPS 接口 |
| 主流语言 | Python(requests + pytest)、Java(RestAssured + TestNG) |
| 测试用例组织 | 函数/方法级用例,支持用例分组和标签 |
| 数据驱动 | pytest 参数化、YAML/JSON/Excel 外部数据文件 |
| 接口关联 | 通过全局 Session、临时变量、token 提取实现 |
| 断言能力 | 状态码、响应体字段、数据库结果、耗时 |
| 报告输出 | Allure 报告、HTML 报告、Jenkins 集成 |
| 批量任务 | pytest 批量收集执行、多进程/多线程扩展 |
| 适合场景 | 接口回归测试、冒烟测试、CI/CD 质量门禁 |
从使用门槛看,Python 方案更适合中小团队快速落地,Java 方案更适合已有 Java 技术栈、需要跟 Maven 工程整合的团队。两者在框架设计思路上是相通的,核心都是“请求层 + 用例层 + 数据层 + 报告层”分层。
2. 适用场景与使用边界
接口自动化测试框架适合谁来用?最直接的答案是:已经在做手工接口测试、想把它沉淀成自动化用例的测试同学;以及后端接口数量多、每次上线前手工回归耗时长的研发团队。
它能解决的问题比较明确:
- 接口回归:每次代码变更后自动跑一遍核心接口,快速发现接口地址、入参校验、返回结构、状态码等层面的问题。
- 冒烟测试:新环境部署后,用一小撮高优先级用例验证主链路是否可用。
- 数据校验:请求后除了看 HTTP 状态码,还能查数据库、比对结果字段,这是手工测试很难稳定做到的事情。
- 持续集成:接入 Jenkins 或 GitLab CI,提交代码后自动执行,失败时通知到人。
不做边界控制的话,接口自动化也可能成为一个“负担工程”。比如:接口响应结构频繁变化,用例断言改来改去;测试数据没有隔离,用例互相影响;为了追求覆盖率,把大量一次性接口写死成用例,后期维护成本极高。所以框架落地之前,先确认你要长期回归哪些稳定接口,先保证一两条核心链路跑通,再横向扩展。
这里还要强调合规问题。落地接口自动化测试时,测试环境权限、测试账号、测试数据都必须控制在授权范围内。不要用线上生产数据进行自动化测试,更不能把包含敏感信息的请求日志、响应报文随便上传到公共报告平台。涉及用户数据、支付数据、隐私数据的接口,在用例脚本和报告中应该做脱敏处理。写爬虫式脚本去大量请求没有授权的接口,或者在接口层做自动化攻击验证,都不属于测试框架的正常使用范围。
3. 环境准备与前置条件
3.1 Python 方案环境准备
Python 接口自动化测试框架需要准备的环境比较简单:Python 3.8 以上、pip 包管理工具、一个趁手的 IDE(PyCharm 或 VS Code 都可以)。Windows、macOS、Linux 都可以作为执行环境,没有特别限制。
需要安装的核心依赖如下:
pip install requests pytest pytest-html allure-pytest pyyaml安装完成后,用一条命令验证是否安装成功:
pytest --version如果能看到 pytest 版本号,说明基础环境没问题。Allure 报告如果要生成 HTML 看板,还需要额外安装 Allure 命令行工具。macOS 可以通过 Homebrew 安装,Windows 可以下载压缩包后配置环境变量。
# macOS 安装 Allure 命令行工具 brew install allure # 检查 allure 是否安装成功 allure --version如果你不想装 Allure,pytest-html 也能生成基础 HTML 报告,适合快速查看执行结果,只是信息丰富度不如 Allure。
3.2 Java 方案环境准备
Java 技术线主要使用 Maven 管理依赖,推荐 JDK 8 或 JDK 11,IDE 使用 IntelliJ IDEA。在pom.xml中引入以下核心依赖:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>5.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.8.0</version> <scope>test</scope> </dependency>Java 方案的优势是可以直接复用团队已有的 Maven 工程和代码规范,与 Java 微服务项目结合更自然。缺点是写起来比 Python 啰嗦,数据驱动和报告配置也需要更多样板代码。
3.3 接口测试环境检查
不管选哪种语言,接口自动化测试框架都需要一个可用的被测环境。这里给一套通用检查清单:
- 被测接口地址是否可访问,可以用 Postman 或 curl 先手工验证。
- 是否需要 Token、Cookie 或其他鉴权信息,鉴权如何获取,是否过期。
- 是否存在依赖前置数据,比如要先创建订单才能查订单详情。
- 接口返回结构是否稳定,字段名是否有变化风险。
这一步如果没做好,后面写的所有用例都可能因为环境问题集体失败,而不是被测代码真的有 Bug。
4. 接口自动化测试框架怎么搭建:目录结构与基础代码
框架搭建不是把 requests 的请求代码写成函数就完了,而是需要一套分层结构。推荐使用下面这种目录组织方式:
api_test_framework/ ├── config/ │ ├── __init__.py │ └── settings.py # 全局配置:环境地址、超时时间 ├── common/ │ ├── __init__.py │ ├── http_client.py # 请求封装 │ ├── assert_utils.py # 断言工具 │ └── token_utils.py # token 管理 ├── data/ │ ├── login_data.yaml # 数据驱动用例数据 │ └── order_data.json ├── testcases/ │ ├── __init__.py │ ├── conftest.py # fixture 定义 │ ├── test_login.py │ └── test_order.py ├── reports/ # 测试报告输出目录 ├── pytest.ini └── requirements.txt这种分层思路的关键是:请求逻辑不写在测试用例里,测试用例只描述“我要测什么、预期是什么”,数据从外部文件读取,公共逻辑抽到 common 目录。这样换环境、换接口地址、换测试数据的时候,不需要改用例代码。
pytest.ini用来配置 pytest 的运行参数:
[pytest] testpaths = testcases python_files = test_*.py python_classes = Test* python_functions = test_* addopts = -v --alluredir=reports/allure-results --clean-alluredir这个配置指定了 pytest 只会收集testcases目录下test_*.py文件中的test_*函数,并且执行后自动把 Allure 结果输出到reports/allure-results。
5. 核心技能一:接口请求封装与断言
5.1 请求封装
接口自动化的第一个核心技能是请求封装。直接用requests.get()写用例虽然简单,但每个用例都要填 headers、处理异常、打日志,重复代码会越来越多。建议封装一个通用的 HTTP Client。
# common/http_client.py import requests import logging logger = logging.getLogger(__name__) class HttpClient: def __init__(self, base_url, timeout=10): self.base_url = base_url self.timeout = timeout self.session = requests.Session() def request(self, method, path, **kwargs): url = self.base_url + path kwargs.setdefault("timeout", self.timeout) logger.info(f"请求地址: {url}, 请求参数: {kwargs}") response = self.session.request(method, url, **kwargs) logger.info(f"响应状态码: {response.status_code}, 响应体: {response.text[:500]}") return response def get(self, path, **kwargs): return self.request("GET", path, **kwargs) def post(self, path, **kwargs): return self.request("POST", path, **kwargs)这段封装做了几件事:统一拼接 base_url,统一设置超时时间,使用 Session 保持连接,打印请求日志和响应日志。日志是接口自动化里非常容易被忽略但非常重要的能力,接口报错时,没有日志很难定位是环境问题、数据问题还是代码问题。
5.2 用例层与断言
请求封装完成之后,写第一条测试用例。以登录接口为例:
# testcases/test_login.py import pytest from common.http_client import HttpClient BASE_URL = "https://api.example.com" @pytest.fixture(scope="session") def client(): """整个测试过程只初始化一次请求客户端""" return HttpClient(BASE_URL) def test_login_success(client): """验证用户名密码正确时登录成功""" payload = { "username": "test_user", "password": "123456" } response = client.post("/api/login", json=payload) assert response.status_code == 200 assert response.json()["code"] == 0 assert response.json()["data"]["token"] != ""断言是接口自动化测试框架的第二个核心技能。上面的用例用了三个断言:状态码断言、业务 code 断言、token 非空断言。实际项目中,断言还可以再细化为:
- 状态码断言:HTTP 状态码是否为 200。
- 业务码断言:响应体中的 code 字段是否为 0。
- 字段值断言:关键字段值是否符合预期。
- 类型断言:字段类型是否正确。
- 耗时断言:接口响应耗时是否超过阈值。
- 数据库断言:查询数据库确认写入结果正确。
如果项目表结构复杂,数据库断言可以单独封装一个 DB 工具类,不要在用例里直接写 SQL 连接代码。
5.3 Java 方向对照
Java 的 RestAssured 写法也很直观:
import io.restassured.RestAssured; import io.restassured.response.Response; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static org.hamcrest.Matchers.*; public class LoginTest { @BeforeClass public void setUp() { RestAssured.baseURI = "https://api.example.com"; } @Test public void testLoginSuccess() { String body = "{\"username\":\"test_user\",\"password\":\"123456\"}"; Response response = RestAssured.given() .header("Content-Type", "application/json") .body(body) .when() .post("/api/login") .then() .statusCode(200) .body("code", equalTo(0)) .extract() .response(); System.out.println(response.asString()); } }这里用到了 Hamcrest 的equalTo断言,和 Python 的assert比起来,Java 断言的错误信息更结构化,定位失败时更直观。
6. 核心技能二:数据驱动与测试用例管理
接口自动化测试框架能不能应对真实业务,很大程度上取决于数据驱动能力。一个登录接口,可能需要测用户名正确、密码错误、用户不存在、验证码失效、账号锁定等多种场景。如果每个场景写一个测试函数,用例会爆炸式增长。数据驱动的思路是:测试逻辑写成一套,测试数据放到外部文件,通过参数化机制批量执行。
6.1 pytest 参数化
Python 中最简单的方式是使用 pytest 的@pytest.mark.parametrize:
# testcases/test_login.py import pytest from common.http_client import HttpClient BASE_URL = "https://api.example.com" @pytest.fixture(scope="session") def client(): return HttpClient(BASE_URL) @pytest.mark.parametrize("username,password,expected_code,expected_msg", [ ("test_user", "123456", 0, "登录成功"), ("test_user", "wrong_password", 1001, "用户名或密码错误"), ("not_exist_user", "123456", 1002, "用户不存在"), ]) def test_login_scenarios(client, username, password, expected_code, expected_msg): """登录接口数据驱动用例""" payload = {"username": username, "password": password} response = client.post("/api/login", json=payload) assert response.status_code == 200 assert response.json()["code"] == expected_code assert response.json()["msg"] == expected_msg这样一套逻辑可以覆盖多个测试场景。执行时 pytest 会自动生成多个测试用例节点:
pytest testcases/test_login.py -v你会看到每个参数组合都变成了一个独立的测试用例:
test_login.py::test_login_scenarios[test_user-123456-0-登录成功] PASSED test_login.py::test_login_scenarios[test_user-wrong_password-1001-用户名或密码错误] PASSED test_login.py::test_login_scenarios[not_exist_user-123456-1002-用户不存在] PASSED6.2 YAML 数据文件驱动
参数写在代码里对少量场景够用,但大量用例数据时更推荐把数据放到 YAML 或 JSON 文件里,用例代码只读取数据。这样测试人员不需要懂代码也能维护用例。
# data/login_data.yaml testcases: - name: "登录成功" data: username: "test_user" password: "123456" expected: code: 0 msg: "登录成功" - name: "密码错误" data: username: "test_user" password: "wrong_password" expected: code: 1001 msg: "用户名或密码错误"读取 YAML 数据并驱动用例:
# testcases/test_login_data_driven.py import yaml import pytest from common.http_client import HttpClient BASE_URL = "https://api.example.com" def load_login_data(): with open("data/login_data.yaml", encoding="utf-8") as f: data = yaml.safe_load(f) return [(case["data"], case["expected"]) for case in data["testcases"]] @pytest.fixture(scope="session") def client(): return HttpClient(BASE_URL) @pytest.mark.parametrize("payload,expected", load_login_data()) def test_login_data_driven(client, payload, expected): response = client.post("/api/login", json=payload) assert response.status_code == 200 assert response.json()["code"] == expected["code"] assert response.json()["msg"] == expected["msg"]这样如果你要新增 20 条登录异常场景,只需要往 YAML 文件里加数据,不需要改任何 Python 代码。
6.3 Excel 数据驱动
很多企业的测试用例本来就维护在 Excel 里,这时候可以让框架直接读取 Excel,减少用例迁移成本。读取 Excel 可以用openpyxl:
pip install openpyxl# common/excel_utils.py import openpyxl def read_excel_cases(file_path, sheet_name=None): """读取 Excel 测试用例,返回字典列表""" workbook = openpyxl.load_workbook(file_path, data_only=True) sheet = workbook[sheet_name] if sheet_name else workbook.active rows = list(sheet.iter_rows(values_only=True)) if not rows: return [] headers = rows[0] cases = [] for row in rows[1:]: if row[0] is None: continue cases.append(dict(zip(headers, row))) return cases使用 Excel 驱动时,建议把“是否执行”作为第一列,用例标记为“否”时直接跳过。这样排查问题时不用删数据,只需改标记。
7. 核心技能三:接口关联、Token 鉴权与全局会话
真实业务中很少有孤立接口。登录接口拿到 token,创建订单接口需要 token,查询订单详情又需要订单 ID。这种接口之间的数据传递在框架中必须显式处理。
7.1 基于文件的 Token 关联
最常见的方式是先从登录接口获取 token,存到全局变量或文件中,后续用例读取。pytest 的 fixture 非常适合做这件事:
# testcases/conftest.py import pytest from common.http_client import HttpClient BASE_URL = "https://api.example.com" @pytest.fixture(scope="session") def client(): """初始化请求客户端,并在登录后写入 token""" http_client = HttpClient(BASE_URL) login_payload = {"username": "test_user", "password": "123456"} response = http_client.post("/api/login", json=login_payload) token = response.json()["data"]["token"] http_client.session.headers.update({"Authorization": f"Bearer {token}"}) return http_client这样后续所有用例在发起请求时,都会自动携带Authorization: Bearer <token>,不需要每个用例手动传 token。
7.2 接口返回值的动态传递
有些接口的返回值不是 token,而是订单 ID、用户 ID 等业务数据。处理思路是通过一个临时变量管理器来保存上一个接口的返回值,供下一个接口使用。
# common/context.py class Context: """测试上下文,用于在接口之间传递数据""" def __init__(self): self._store = {} def set(self, key, value): self._store[key] = value def get(self, key): return self._store.get(key) context = Context()在用例中使用:
from common.context import context def test_create_order(client): """创建订单并保存订单号""" payload = {"product_id": 1001, "count": 2} response = client.post("/api/order/create", json=payload) assert response.status_code == 200 order_id = response.json()["data"]["order_id"] context.set("order_id", order_id) def test_query_order(client): """使用上一个用例保存的订单号查询订单""" order_id = context.get("order_id") assert order_id is not None response = client.get(f"/api/order/{order_id}") assert response.status_code == 200 assert response.json()["data"]["order_id"] == order_id值得提醒的是:严格来说测试用例之间不应该有顺序依赖,因为 pytest 默认不保证用例按定义顺序执行。但实际业务中“创建订单后查询订单”这种链路很常见。稳妥的做法是用 pytest 插件pytest-ordering显式标注顺序:
pip install pytest-ordering@pytest.mark.run(order=1) def test_create_order(client): ... @pytest.mark.run(order=2) def test_query_order(client): ...另一种更推荐的做法是:把这类有依赖关系的接口链路放在同一个测试函数中,而不是拆成多个测试函数。这样既能保证执行顺序,又不会因为某个用例失败影响后续用例的可重入性。
7.3 数据库断言与前置数据清理
接口关联不只发生在接口之间,也发生在接口和数据库之间。自动化用例需要在自己的测试数据上运行,因此在执行前,应该清理旧数据或用唯一标识区分数据。以 Python 为例,可以用 pymysql 封装一个数据库查询工具:
pip install pymysql# common/db_utils.py import pymysql def query_one(sql, db_config): """查询单条数据""" conn = pymysql.connect(**db_config) try: with conn.cursor() as cursor: cursor.execute(sql) return cursor.fetchone() finally: conn.close()在用例中校验数据库写入结果:
def test_create_order_check_db(client, db_config): payload = {"product_id": 1001, "count": 2} response = client.post("/api/order/create", json=payload) assert response.status_code == 200 order_id = response.json()["data"]["order_id"] row = query_one( f"SELECT status FROM orders WHERE order_id = '{order_id}'", db_config ) assert row is not None assert row[0] == "CREATED"这里需要注意 SQL 注入风险。测试框架中的 SQL 拼接要严格限定在测试数据范围内,不要允许外部输入直接拼进 SQL。
8. 核心技能四:报告输出与持续集成
用例能跑不是终点,接口自动化测试框架要真正发挥作用,必须能在无人值守环境下批量执行并输出可靠报告。
8.1 生成 Allure 报告
使用 Allure 之前,先确认 pytest 配置中已经指定了--alluredir:
pytest testcases -v --alluredir=reports/allure-results执行完成后,生成 Allure 报告网页:
allure generate reports/allure-results -o reports/allure-report --clean打开报告:
allure open reports/allure-reportAllure 报告里面可以看到:
- 总用例数、通过数、失败数、跳过数。
- 每个用例的执行时间、步骤日志、请求参数、响应体。
- 失败用例的断言信息。
- 历史执行趋势图。
如果需要在用例中记录测试步骤,可以使用allure.step():
import allure @allure.step("登录系统") def login(client, username, password): payload = {"username": username, "password": password} return client.post("/api/login", json=payload) @allure.feature("登录模块") class TestLogin: @allure.story("登录成功场景") def test_login_success(self, client): response = login(client, "test_user", "123456") assert response.status_code == 200这样报告的可读性会大幅提升,领导或开发同学打开报告就能定位是哪个业务模块出了问题。
8.2 接入 Jenkins
框架本地跑通后,下一步是接到 CI/CD。Jenkins 中创建一个自由风格任务,配置如下:
- 源码管理选择 Git,填入接口自动化测试仓库地址。
- 构建环境里配置 Python 环境。
- 构建步骤添加“执行 Shell”:
pip install -r requirements.txt pytest testcases -v --alluredir=reports/allure-results allure generate reports/allure-results -o reports/allure-report --clean- 构建后操作选择 Allure Report,配置报告路径
reports/allure-report。
之后每次代码提交,Jenkins 都会自动拉取最新代码并执行接口自动化用例。如果执行失败,可以配置邮件通知或企业微信/钉钉机器人消息,让测试同学第一时间收到失败详情。
8.3 Java 方案中集成测试报告
如果使用 Java 技术线,Maven 工程中可以通过maven-surefire-plugin生成 TestNG 的执行结果,然后同样使用 Allure 生成可视化报告。基本的pom.xml配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> </plugin>9. 接口自动化测试框架常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 用例全部失败且提示连接超时 | 被测环境未启动或地址错误 | ping 接口地址,用 Postman 手工请求 | 确认环境地址,检查防火墙 |
| 部分用例需要登录 token 后仍 401 | token 未注入请求头或 token 过期 | 查看日志中请求头是否包含 Authorization | 在 fixture 中刷新 token,设置自动续期 |
| YAML 数据读取失败 | YAML 缩进格式错误 | 使用 yaml lint 工具检查格式 | 修正 YAML 缩进 |
| 接口响应字段不稳定 | 开发改了字段名 | 检查接口文档和实际返回值 | 与开发确认统一字段名 |
| 用例之间有数据依赖,执行顺序错乱 | pytest 默认按收集顺序执行 | 查看 pytest 收集顺序 | 使用 pytest-ordering 或者合并链路用例 |
| Allure 报告没有生成 | allure 命令行工具未安装 | 执行allure --version | 安装 Allure 命令行工具 |
| 批量执行时内存占用增加 | 测试数据量过大 | 观察进程内存 | 控制并发数,分批执行 |
| 数据库断言失败 | 数据未提交或事务未生效 | 手动连数据库查询 | 确认测试数据写入方式 |
| 接口超时频繁 | 被测接口性能瓶颈 | 查看服务端日志和响应耗时 | 区分性能问题与功能问题 |
| 测试环境中敏感数据泄露 | 日志打印了完整响应体 | 检查日志配置 | 对响应体做脱敏处理 |
从上面的表格可以看出,接口自动化测试框架排错的大方向有两类:一类是环境问题,比如地址不通、鉴权过期、数据缺失;另一类是代码问题,比如断言写错、逻辑用错、字段变化。遇到问题先看日志,再看环境,最后再怀疑框架本身。
10. 最佳实践与使用建议
接口自动化测试框架要长期稳定运行,不能只停留在把代码写出来。以下是我在实际项目中比较推荐的做法:
10.1 第一次先小参数测试
不要一开始就把几百个接口全部写成自动化用例。先选 3 到 5 个核心接口,跑通“请求、断言、数据驱动、报告”整条链路,验证框架的稳定性和团队协作方式。小步快跑比一次铺开更容易落地。
10.2 分层设计,请求和用例分离
请求封装、数据读取、断言工具、用例代码要严格分层。测试用例里不应该出现requests.post()的直接调用,更不应该出现连接数据库、读取 Excel 的逻辑。用例只负责描述业务场景和预期结果。
10.3 测试数据隔离与管理
测试用例尽量使用独立环境,避免多人共用一套测试数据导致互相干扰。如果必须共享环境,每个用例使用唯一标识(时间戳、UUID)来创建自己的数据,并在用例结束后清理。这样可以保证用例可以重复执行。
10.4 接口变动要显式通知
接口自动化测试最怕接口悄悄变更。在团队协作中,可以约定接口文档更新后,后端开发需要同步通知测试同学更新用例。更工程化的方式是接入接口文档平台,自动对比接口定义。
10.5 批量任务加日志和重试机制
接口自动化测试批量执行时,一定要有日志输出。日志建议包含请求地址、请求参数、响应状态码、响应体摘要。对于网络抖动导致的不稳定用例,可以在框架层面增加重试机制。pytest 中可以使用pytest-rerunfailures:
pip install pytest-rerunfailurespytest testcases -v --reruns 2 --reruns-delay 1但重试要谨慎使用。只对“网络超时”“服务暂时不可用”这类环境问题重试,断言失败不要重试,否则会掩盖真实 Bug。
10.6 接口服务访问和安全边界
接口自动化测试框架本身只是测试工具,但使用中要注意安全边界。测试环境的账号权限、数据库连接信息、Token、密钥等敏感配置不要提交到 Git 仓库。建议通过环境变量或本地配置管理工具来管理敏感信息。涉及人脸、声音、支付、用户隐私等敏感接口时,测试数据必须脱敏,且只能在授权范围内使用。
10.7 定时任务与质量门禁
框架稳定后,可以设置定时任务,每天凌晨自动跑一次全量接口回归。同时在 CI/CD 流水线中加入质量门禁,比如核心用例通过率低于 99% 时阻塞发布。这会让接口自动化测试从“测试工具”变成“质量保障机制”。
11. 总结与下一步
接口自动化测试框架的核心技能,说到底就是四件事:请求封装、断言设计、数据驱动、报告与集成。这四件事环环相扣,前面任何一环没有做好,后面都会变成维护负担。Python 用 requests + pytest + Allure,Java 用 RestAssured + TestNG + Maven,都能搭建一套能用的框架,重点不是选哪个语言,而是你有没有把用例分层、数据分离、批量执行和报告输出这些工程化能力真正落地。
建议你先从一条业务链路开始,比如“登录 -> 创建订单 -> 查询订单 -> 删除订单”,把这四个接口完整跑通,再逐步扩大覆盖范围。最容易踩的坑不是请求写不出来,而是接口关联没处理好、测试数据互相污染、断言只写了状态码、日志不完整导致问题定位困难。
后续可以继续扩展的方向有很多:把测试用例接入 CI/CD 流水线,让每次提交代码都自动触发接口回归;把框架接入 MQ 消息队列做异步接口测试;引入性能测试工具对关键接口做基准回归。推荐收藏这篇作为接口自动化测试框架的搭建参考,从最小可用框架开始,一步步把测试能力沉淀下去。