3. 自动化测试原理
做自动化测试这么多年,我经常被问到同一个问题:「到底该选哪个框架?」
说实话,没有银弹。每个框架都有自己的脾气秉性。选错了,后面全是坑。选对了,事半功倍。
今天我就把 Selenium、Appium、Requests、Pytest、Unittest、Robot Framework 这六个主流框架掰开揉碎讲清楚。你想想看,搞明白它们的核心差异,以后项目选型就不会再纠结了。
核心观点:框架选型不是选「最好的」,而是选「最合适的」。技术栈、团队能力、项目类型,这三个因素决定了最终答案。
3.1 先看一张全景图
下面这张图,是我自己整理的知识结构。它把六大框架按「应用层」和「协议层」做了划分,方便你快速定位。
3.2 六大框架逐个拆解
3.2.1 Selenium — Web UI 自动化的老大哥
Selenium 是浏览器自动化的标准。它模拟用户在浏览器里的操作:点击、输入、滚动、截图。支持 Chrome、Firefox、Edge 等主流浏览器。
适用场景:Web 端回归测试、跨浏览器兼容性测试、爬虫。
我个人习惯用 Selenium 配合 Page Object 模式写用例。这样页面元素变了,只需要改一个地方,不用满世界找定位符。
避坑指南:我曾经因为隐式等待和显式等待混用,导致用例跑得忽快忽慢。后来统一只用显式等待,问题就解决了。记住:不要混用等待策略。
3.2.2 Appium — 移动端自动化的主力
Appium 是 Selenium 的移动版。它用同样的 WebDriver 协议,但操作的是手机 App。支持 iOS 和 Android。
适用场景:App 功能回归测试、跨版本兼容性测试。
嗯,这里要注意:Appium 启动慢,是真的慢。我建议你在 CI 里提前启动 Appium Server,别让用例等它。
3.2.3 Requests — 接口测试的瑞士军刀
Requests 是 Python 里最优雅的 HTTP 库。用它写接口测试,代码简洁到让人心情愉悦。
import requests
# 一个完整的接口测试用例
def test_login_success():
url = "https://api.example.com/login"
payload = {"username": "admin", "password": "123456"}
resp = requests.post(url, json=payload)
assert resp.status_code == 200
assert resp.json()["code"] == 0
适用场景:API 自动化测试、契约测试、数据 mock。
说白了,接口测试比 UI 测试稳定得多。我在项目中遇到过一个坑:UI 用例跑 100 次挂 20 次,换成接口测试后,100 次全过。所以我的建议是:能用接口测的,就别用 UI 测。
3.2.4 Pytest — Python 测试框架的王者
Pytest 是目前 Python 社区最流行的测试框架。它简洁、灵活、插件丰富。
核心优势:
- 自动发现测试用例(不用手动注册)
- 强大的 fixture 机制(替代 setup/teardown)
- 丰富的插件生态(allure、xdist、cov)
- 参数化测试(一条用例跑多组数据)
import pytest
# 参数化示例
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(0, 0, 0),
(-1, 1, 0),
])
def test_add(a, b, expected):
assert a + b == expected
我个人强烈推荐 Pytest。它几乎成了 Python 自动化测试的事实标准。你想想看,连 Django 和 Flask 都在用,生态能差吗?
3.2.5 Unittest — Python 自带的「老黄牛」
Unittest 是 Python 标准库里的测试框架。它不需要额外安装,开箱即用。
特点:
- 基于 Java 的 JUnit,风格偏重
- 必须写类和方法,不能写函数
- 断言方法多(assertEqual、assertTrue 等)
- 没有参数化,需要自己写循环
注意:Unittest 的 setUp/tearDown 是类级别的,fixture 复用性差。如果你团队刚起步,我建议直接上 Pytest,别在 Unittest 上浪费时间。
3.2.6 Robot Framework — 关键字驱动的「低代码」方案
Robot Framework 用关键字(Keyword)来组织用例。测试用例可以写成表格形式,非技术人员也能看懂。
适用场景:验收测试(ATDD)、业务人员参与的测试、跨团队协作。
*** Test Cases ***
用户登录成功
打开浏览器 chrome
输入用户名 admin
输入密码 123456
点击登录按钮
页面应包含 欢迎回来
说实话,Robot Framework 的学习曲线不低。它的关键字库、变量文件、资源文件,一套下来挺复杂的。但如果你团队里有业务人员要写用例,它确实是个好选择。
3.3 核心对比表
| 框架 | 类型 | 学习成本 | 社区生态 | 适用场景 | 我的推荐指数 |
|---|---|---|---|---|---|
| Selenium | Web UI 驱动 | 中 | ★★★★★ | Web 端回归、兼容性 | ★★★★☆ |
| Appium | 移动端驱动 | 中高 | ★★★★ | App 功能测试 | ★★★★ |
| Requests | HTTP 库 | 低 | ★★★★★ | 接口测试 | ★★★★★ |
| Pytest | 测试框架 | 低 | ★★★★★ | 所有 Python 项目 | ★★★★★ |
| Unittest | 测试框架 | 低 | ★★★ | 简单项目、标准库依赖 | ★★★ |
| Robot Framework | 关键字框架 | 高 | ★★★★ | ATDD、业务协作 | ★★★☆ |
3.4 选型决策流程
每次做选型,我都会按下面这个流程走一遍。你照着来,基本不会出错。
- 先看被测对象:Web 用 Selenium,App 用 Appium,接口用 Requests。
- 再看团队语言:Python 团队首选 Pytest,Java 团队考虑 TestNG。
- 再看团队构成:纯技术人员用 Pytest,有业务人员参与考虑 Robot Framework。
- 最后看维护成本:UI 测试维护成本高,优先用接口测试覆盖核心逻辑。
我的经验:80% 的自动化测试收益来自接口测试。UI 测试只覆盖关键流程和视觉验证。别把 UI 测试当成万能药,它只是最后一道防线。
3.5 常见组合方案
实际项目中,很少只用单一框架。下面是我见过最多的几种组合:
- Selenium + Pytest + Allure:Web UI 自动化标准方案
- Appium + Pytest + Allure:移动端自动化标准方案
- Requests + Pytest + Allure:接口自动化标准方案
- Robot Framework + SeleniumLibrary:关键字驱动 Web 测试
- Unittest + HTMLTestRunner:老项目遗留方案(建议迁移)
你想想看,选型其实没那么复杂。搞清楚「测什么」「谁来测」「怎么维护」这三个问题,答案自然就出来了。