“功能测试 vs 自动化测试”是 QA 领域最常见的对比之一,但这种对比往往建立在一个误解之上。这两个术语并非对立关系。它们描述的是完全不同的维度,你可以只有其中之一,也可以两者兼而有之。将它们视为“功能测试 或 自动化测试”的二选一选择,会导致团队构建错误的测试策略。
本指南将理清这两个术语,解释它们所属的两个独立维度,并展示它们在实际 API 测试工作流中的位置。
范畴错误
混淆源于将两个不同问题的答案进行对比。
功能测试回答的是:我们在测试什么? 它测试软件是否实现了预期的功能、行为、输出和特性。
自动化测试回答的是:我们如何运行测试? 它使用软件工具来运行测试,而不是由人工手动执行步骤。
这两者是相互独立的。“测试什么”和“如何运行”是两个不同的轴。功能测试可以手动运行,也可以自动运行。自动化测试可以检查功能行为,也可以检查非功能行为(如性能)。因此,真正的对比不是功能测试与自动化测试,而是恰好被同时提及的两个不同维度。
一旦你理解了这一点,“我们应该做功能测试还是自动化测试?”这个问题就不再有意义了。正确的问题应该是:我们应该测试什么,以及其中哪些测试应该自动化?
什么是功能测试
功能测试验证应用程序的每个功能是否符合其需求。它通常是黑盒测试:测试人员在不查看内部代码的情况下检查输入和输出。给功能一个输入,观察输出,并将其与需求文档中规定的结果进行比较。
对于 API 而言,功能测试意味着确认一个 Endpoint 返回了正确的数据、正确的状态码和正确的错误响应。POST /orders 是否创建了订单?它是否会拒绝带有 400 状态码的无效 Payload?响应是否符合记录的 Schema?这些都是功能检查,它们依赖于 API assertions(API 断言)来对比实际响应与预期响应。
功能测试的优势在于直接相关性:它检查用户真正关心的东西,即功能是否正常工作。其局限性在于范围。仅靠功能测试无法说明速度、负载下的稳定性或安全性。一个 Endpoint 可能在功能上是完美的,但在流量压力下仍会崩溃;这种差距正是 performance testing(性能测试)所涵盖的。功能测试是必要的,但它不是全部。
功能测试的对立面是非功能测试(性能、负载、安全、易用性等),这才是该术语正确的对应项,而不是“自动化测试”。
什么是自动化测试
自动化测试使用工具和脚本来执行测试并检查结果,而不是由人工手动点击步骤。你只需定义一次测试及其输入和预期结果,工具就可以根据需求、按计划或在每次代码更改时运行它。
自动化测试的对立面是手动测试,即由人工执行每个步骤。这才是该术语正确的对应项。
自动化的价值在于一致性和规模。机器运行第一千次测试与第一次完全相同,且永不疲倦。它使回归测试的成本降低到可以在每次提交时运行。其代价是自动化测试必须编写和维护,且它们无法进行主观判断,只能检查你告诉它们的预期内容。关于这一点的深入探讨可以参考 what is automated testing。
至关重要的一点是,自动化是一种交付机制,而不是一种测试类型。你自动化的是某种测试(功能、性能、安全)。“自动化测试”本身并没有说明正在检查什么。
两个维度的结合
将这两个轴放在一起,你会得到四个实际存在的类别,它们在实践中都非常有用。
| | 功能测试 | 非功能测试 | | :--- | :--- | :--- | | 手动 | 测试人员点击结账流程以确认其正常工作 | 测试人员判断 UI 响应是否灵敏 | | 自动化 | 脚本调用 Endpoint 并断言响应是否正确 | 负载测试驱动 500 个虚拟用户并测量延迟 |
表格中的每个单元格都是一种合法且常见的测试类型。左上角的“手动功能测试”是大多数人听到“测试”时脑海中浮现的场景。左下角的“自动化功能测试”是现代 API 测试套件的主要组成部分:自动检查功能的脚本或场景。右侧列是非功能性工作,同样可以通过两种方式完成。
因此,有意义的决策不是“功能还是自动化”,而是:
- 测试哪些行为:功能和非功能都需要覆盖。
- 自动化哪些测试:选择稳定的、重复的、高价值的测试;将探索性和侧重主观判断的检查留给手动测试。
一个测试可以位于任何单元格中,一个健康的策略应该涵盖这四个方面。
API 测试中的应用
API 测试是这两个维度结合最紧密的地方,因为 API 非常适合自动化功能测试。
API 具有清晰的契约(Contract)、结构化的请求和响应,且没有 UI 需要渲染。这使得它的功能行为很容易通过脚本进行检查,并能进行精确断言。因此,对于 API,大部分功能测试应该自动化。当工具可以在每次提交时完成这项工作时,没有理由手动重复发送相同的请求并用肉眼观察响应数百次。
一个实际的 API 测试方法如下:功能检查(状态码、响应体、Schema 符合性、错误格式)被编写为 test cases(测试用例)并分组为 test scenarios(测试场景)。这些场景通过 CI/CD 在每次变更时自动运行。非功能性检查(负载和性能)也按计划自动运行。手动精力则投入到探索性测试和验证 API 是否真正解决了问题上,即需要主观判断而非脚本完成的 validation(确认)工作。
哪些该自动化,哪些该保留手动
清晰地看到这两个维度后,会引出一个真正重要的问题:在所有可以运行的功能测试中,哪些值得自动化?全部自动化是浪费的,而自动化错误的东西会产生缓慢且脆弱的测试套件。以下是一些规则:
自动化重复且稳定的部分。 如果一个功能检查在未来两年内每次提交都要运行,那么它就是完美的自动化候选对象。编写它的成本将获得数百倍的回报。回归测试(确认旧功能仍然正常的检查)是最典型的案例。
优先自动化高价值路径。 登录流程、结账、核心 API Endpoint,任何一旦失败就会导致严重事故的部分,都应该尽早自动化。这些是在截止日期压力下你无法承担跳过风险的测试,自动化消除了这种诱惑。
不要自动化罕见或不稳定的部分。 只运行两次的检查不值得编写脚本。每天都在变化的功能每天都会破坏其测试;请等到它稳定下来。对变动目标进行过早自动化只会产生维护噪音。
保持探索性测试为手动。 自动化测试只能发现你让它们寻找的东西。人工以非脚本化的方式“试探”软件,可以发现没人预料到的 Bug。这项工作也是功能测试,且应该有目的地保持手动。
保持基于判断的检查为手动。 错误消息是否真正有帮助、工作流是否连贯、API 是否真正解决了用户的问题,这些都需要人来判断。没有任何断言可以捕捉到这些。
结果是一个深思熟虑的分工:一个庞大的自动化功能套件覆盖稳定、关键、重复的路径,以及一个较小的、持续的手动工作,专注于探索和判断。深思熟虑地进行自动化的团队可以获得快速反馈而不会产生脆弱的套件;而试图自动化一切的团队最终会陷入维护测试而非交付产品的困境。
在 Apifox 中构建自动化功能 API 测试
Apifox 专为无需脚本的自动化功能 API 测试而设计。你可以定义 Endpoint,为状态码、响应体字段、Schema 和响应时间添加可视化断言,然后将请求分组到测试场景中。这些场景可以按需运行或在 CI 流水线中运行,自动执行功能检查并准确报告哪个断言失败。
由于同一个工作区也可以运行负载测试,你可以在一个地方覆盖功能和非功能、自动化的两个维度。你为正确性构建的功能场景可以直接转化为用于性能测试的负载测试。下载 Apifox 为你现有的 API 构建自动化功能测试套件。
常见问题解答
自动化测试是功能测试的一种吗? 不是。自动化测试是运行测试的一种方式。功能测试是关于测试什么的一个类别。自动化测试可以是功能性的或非功能性的;功能测试可以是手动的或自动化的。
功能测试可以自动化吗? 可以,而且对于 API 来说,通常应该自动化。自动化功能测试(在每次变更时检查功能的脚本或场景)是现代 API 测试套件的核心。
功能测试真正的对立面是什么? 非功能测试:性能、负载、安全和易用性。这些检查的是功能是否产生正确输出之外的特性。
每个功能测试都应该自动化吗? 不。自动化稳定的、重复的、高价值的检查。保持探索性测试和基于判断的验证为手动,因为自动化无法决定某样东西是否真正“好”,只能决定它是否符合预期。
团队应该从哪里开始? 从自动化功能 API 测试开始。它们快速、稳定且覆盖核心逻辑。在此基础上增加自动化非功能测试和手动探索性测试。
自动化测试会取代手动测试人员吗? 不会。它取代了工作中重复的部分(重复运行相同的检查),以便测试人员可以专注于探索性测试、边缘情况以及判断软件是否真正优秀。这些任务需要人,且比手动点击回归清单具有更高的价值。
同一个测试可以既是功能性的又是自动化的吗? 是的,大多数 API 测试正是如此:自动化功能测试。一个调用 Endpoint 并断言响应正确的脚本既检查了功能,又是自动运行的。这两个标签描述的是同一个测试的不同方面,而不是矛盾关系。
开发必备:API 全流程管理神器 Apifox
介绍完上文的内容,我想额外介绍一个对开发者同样重要的效率工具 —— Apifox。作为一个集 API 文档、调试、设计、测试、Mock、自动化测试于一体的工具,Apifox 是目前提升研发效率的首选。
如果你正在开发项目,不妨试试其极其友好的界面设计,它完全兼容 Postman 和 Swagger 数据格式,导入数据非常方便,,即使是新手也能很快上手,点击这里即可注册使用。

值得一提的是,除了个人和常规团队使用,针对有高安全合规要求、或需要在内网环境协作的企业,Apifox 还提供了深度定制的私有化部署方案。
获取专属报价与部署方案
详细的私有化部署系统架构与安全白皮书
针对您公司规模的专属报价单
免费的 1v1 专属产品演示 (Demo) 机会