Sparkle CodesSparkle
项目 / web测试 / Day10

框架决胜:Unittest 与 Pytest 对标与选型

x
xpx
Jun 21, 2024
Editorial Insight
#Allure#Automation#Pytest#Selenium#Unittest

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 自动找到你的代码,必须遵循:

  1. 模块名: 以 test_ 开头或以 _test 结尾。
  2. 类名: 以 Test 开头(且类中不能有 __init__)。
  3. 函数名: 以 test_ 开头。

4. 架构决策

  • 如果你追求稳定且不想折腾: Unittest 的结构化模板非常适合。
  • 如果你需要高效测试、参数化及漂亮报表: Pytest 配合 Allure 是目前的行业标准。
兼容性

惊喜的是,Pytest 能够直接运行 Unittest 风格的脚本。这使得将旧项目迁移到 Pytest 变得非常简单。


继续阅读: Web自动化-Pytest:从入门到数据驱动实战

BACK TO BLOG
The End of Interaction