Web 自动化骨架:选择你的测试框架
编写了大量的 Selenium 脚本后,我们需要一个「管家」来自动发现、执行用例并生成报告。在 Python 生态中,Unittest 和 Pytest 是两大核心选择。
1. 对标:Unittest vs. Pytest
| 特性 | Unittest (标准库) | Pytest (第三方库) |
|---|---|---|
| 安装 | Python 内置,无需安装 | pip install pytest |
| 上手难度 | 高 (必须继承 TestCase) |
低 (支持普通函数) |
| 用例发现 | 需手动构建 TestSuite |
自动识别 test_*.py |
| 断言方式 | 专用方法 self.assertEqual |
简单 assert |
| 插件生态 | 插件少,扩展性一般 | 插件极其丰富 (DDT, 重跑, 报告) |
| 前置/后置 | setUp/tearDown (等级固定) |
Fixture (高度灵活,可控作用域) |
2. 核心案例对比:登录测试
A. Unittest 风格 (经典继承制)
PYTHON
import unittest
class TestLogin(unittest.TestCase):
def setUp(self): # 每条用例前执行
self.driver = webdriver.Chrome()
def test_login_success(self):
# 操作步骤与断言 (必须使用专用断言法)
self.assertEqual(1, 1)
def tearDown(self): # 每条用例后执行
self.driver.quit()
B. Pytest 风格 (极简主义)
PYTHON
import pytest
# 甚至不需要写类,普通函数就行
def test_login_success():
# 直接使用 Python 原生 assert
assert 1 == 1
if __name__ == '__main__':
pytest.main(['-vs', __file__])
3. Pytest 命名「潜规则」
想要让 Pytest 自动找到你的代码,必须遵循:
- 模块名: 以
test_开头或以_test结尾。 - 类名: 以
Test开头(且类中不能有__init__)。 - 函数名: 以
test_开头。
4. 架构决策
- 如果你追求稳定且不想折腾: Unittest 的结构化模板非常适合。
- 如果你需要高效测试、参数化及漂亮报表: Pytest 配合 Allure 是目前的行业标准。
兼容性
惊喜的是,Pytest 能够直接运行 Unittest 风格的脚本。这使得将旧项目迁移到 Pytest 变得非常简单。
继续阅读: Web自动化-Pytest:从入门到数据驱动实战