3. 自动化测试原理

做自动化测试这么多年,我经常被问到同一个问题:「到底该选哪个框架?」

说实话,没有银弹。每个框架都有自己的脾气秉性。选错了,后面全是坑。选对了,事半功倍。

今天我就把 Selenium、Appium、Requests、Pytest、Unittest、Robot Framework 这六个主流框架掰开揉碎讲清楚。你想想看,搞明白它们的核心差异,以后项目选型就不会再纠结了。

核心观点:框架选型不是选「最好的」,而是选「最合适的」。技术栈、团队能力、项目类型,这三个因素决定了最终答案。

3.1 先看一张全景图

下面这张图,是我自己整理的知识结构。它把六大框架按「应用层」和「协议层」做了划分,方便你快速定位。

自动化测试框架选型全景图 应用层(UI / 接口) Selenium Web UI 自动化 Appium 移动端 UI 自动化 Requests HTTP 接口测试 Robot Framework 关键字驱动框架 测试框架层(用例组织 / 断言 / 报告) Pytest Python 生态首选 Unittest Python 内置框架 Robot Framework 关键字驱动框架 说明:Selenium/Appium/Requests 负责「怎么测」,Pytest/Unittest/Robot Framework 负责「怎么组织」 实际项目中,通常将两者组合使用,例如 Selenium + Pytest

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 选型决策流程

每次做选型,我都会按下面这个流程走一遍。你照着来,基本不会出错。

  1. 先看被测对象:Web 用 Selenium,App 用 Appium,接口用 Requests。
  2. 再看团队语言:Python 团队首选 Pytest,Java 团队考虑 TestNG。
  3. 再看团队构成:纯技术人员用 Pytest,有业务人员参与考虑 Robot Framework。
  4. 最后看维护成本:UI 测试维护成本高,优先用接口测试覆盖核心逻辑。

我的经验:80% 的自动化测试收益来自接口测试。UI 测试只覆盖关键流程和视觉验证。别把 UI 测试当成万能药,它只是最后一道防线。

3.5 常见组合方案

实际项目中,很少只用单一框架。下面是我见过最多的几种组合:

  • Selenium + Pytest + Allure:Web UI 自动化标准方案
  • Appium + Pytest + Allure:移动端自动化标准方案
  • Requests + Pytest + Allure:接口自动化标准方案
  • Robot Framework + SeleniumLibrary:关键字驱动 Web 测试
  • Unittest + HTMLTestRunner:老项目遗留方案(建议迁移)

你想想看,选型其实没那么复杂。搞清楚「测什么」「谁来测」「怎么维护」这三个问题,答案自然就出来了。