第一篇:基座选型 —— 为什么 Pytest 是自动化的终点?

环境搭建与架构初探

专栏进度:01 / 10 (自动化实战专题)

在本篇中,我们将完成从零开始的开发环境配置,并理解 Pytest 框架的运行机理,为后续的接口和 UI 自动化扫清障碍。

一、 为什么抛弃 Unittest 拥抱 Pytest?

如果你还在用 Python 自带的 unittest,你可能需要写大量重复的 setUp 和 tearDown。Pytest 的降维打击体现在:

断言更直观:告别 self.assertIn,直接用 Python 原生的 assert a in b。

Fixture 魔法:支持模块级、类级、甚至整个测试会话级的资源共享。

插件生态:

pytest-html:生成简易 HTML 报告。

pytest-xdist:多 CPU 并行执行,让原本跑 1 小时的测试 5 分钟跑完。

pytest-rerunfailures:自动重跑失败的用例,解决网络波动导致的偶发失败。

二、 环境搭建:专业选手的仪式感

在企业级开发中,严禁在全局环境安装包。我们需要通过虚拟环境实现"项目隔离"。

  1. 建立虚拟空间
    Bash

创建虚拟环境 (建议项目根目录下执行)

python -m venv venv

激活环境

Windows:

venv\Scripts\activate

Mac/Linux:

source venv/bin/activate

  1. 核心包"三剑客"安装

我们将一次性安装基础依赖:

Bash

pip install pytest pytest-xdist pytest-ordering pytest-rerunfailures pytest-html

三、 实战:第一个 Pytest 脚本与核心配置

  1. 编写测试脚本 test_demo.py
    Python
python 复制代码
import pytest

def add(a, b):
    return a + b

class TestMath:
    def test_add_success(self):
        assert add(1, 2) == 3
        
    @pytest.mark.parametrize("a, b, expected", [(1, 1, 2), (2, 3, 5)])
    def test_add_batch(self, a, b, expected):
        """演示参数化测试"""
        assert add(a, b) == expected
  1. 核心配置文件 pytest.ini
    这是 Pytest 的"指挥部"。在项目根目录创建该文件,可以固化运行参数:

Ini, TOML

pytest

命令行参数:显示简报、生成报告、失败重跑2次、并行运行

addopts = -vs --html=./reports/report.html --reruns 2 -n auto

测试搜索路径

testpaths = ./tests

模块搜索规则

python_files = test_*.py

类搜索规则

python_classes = Test*

方法搜索规则

python_functions = test_*

四、 架构初探:工业级目录设计

为了让框架具备可维护性,我们必须强制执行模块化:

common/:存放封装好的"工具",如数据库连接器、日志处理器。

conftest.py:重中之重。它是 Pytest 的全局配置文件,用于存放通用的 Fixture(如:登录 Token 的获取、浏览器驱动的启动)。

pytest.ini:全局运行配置,定义搜索规则。

五、 避坑指南:初学者的"配置陷阱"

命名潜规则:文件必须以 test_ 开头,否则 Pytest 运行时会直接忽略它。

根目录迷踪:在运行测试时,建议始终在项目根目录执行 pytest 命令,这能避免模块导入失败(ImportError)的玄学问题。

编码问题:在 pytest.ini 中如果写了中文注释,在 Windows 下可能会导致运行崩溃。对策:确保文件保存为 ANSI 或去掉中文。

🚀 选型之争:Pytest vs Unittest

在 Python 生态中,unittest 是标准库,但为什么工业界几乎全员投奔 pytest?

语法简洁:只需 assert 表达式,不再需要记 self.assertEqual()。

强大的 Fixture 机制:这是 Pytest 的灵魂。它可以实现精细的测试前置(Setup)和后置(Teardown)管理,且支持作用域(Session/Module/Class/Function)共享。

插件生态:拥有超过 800 个开源插件,从分布式运行(xdist)到报告生成(allure),应有尽有。

六、 环境搭建:专业选手的"第一步"

不要直接在全局环境 pip install。专业测试框架必须保证环境可移植性。

  1. 创建虚拟环境

python -m venv venv

source venv/bin/activate # Linux/Mac

venv\Scripts\activate # Windows

  1. 核心包安装

pip install pytest pytest-xdist pytest-ordering pytest-rerunfailures

七、 框架雏形:目录结构设计

一套好的框架,从文件夹分类就能看出专业度:

Plaintext

MyTestFramework/

├── common/ # 通用封装(数据库、日志、配置读取)

├── config/ # 配置文件(环境地址、数据库账号)

├── data/ # 测试数据(yaml/excel)

├── page_objects/ # UI 页面对象

├── tests/ # 测试用例脚本

├── reports/ # 测试报告输出

├── conftest.py # Pytest 全局配置(Fixture 核心)

└── pytest.ini # Pytest 运行参数配置

八、 避坑指南:初学者的"配置陷阱"

命名规范:文件必须以 test_*.py 或 *test.py 命名,类名以 Test 开头,方法名以 test 开头。否则 Pytest 会找不到你的用例。

conftest.py 别乱放:它是插件式的配置,同级及下级目录有效。不要试图在里面写业务逻辑,它只放初始化和清理。

相关推荐
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
dayuOK63072 天前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
志栋智能3 天前
超自动化巡检:如何选择适合你的起点?
运维·自动化
HackTwoHub3 天前
Sqli-Scanner SQL注入SKILL自动化挖掘SQL注入,零依赖自动化SQL注入挖掘,赏金猎人
数据库·人工智能·sql·web安全·网络安全·自动化·系统安全
csdndeyeye3 天前
拆解AI投简历插件:塔塔网申的技术逻辑和实测数据
人工智能·自动化·秋招·ai投简历插件·ai找工作·求职助手·应届生就业
小白学大数据3 天前
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
开发语言·python·自动化
Super Scraper3 天前
如何批量抓取 TikTok 数据而不被封锁?完整指南
爬虫·ai·自动化·抖音·tiktok·ai agent
曦尧3 天前
GitHub - jwasham/coding-interview-university: 一份完整的计算机科学学习计划,助你成为软件工程师。· GitHub
ai·自动化
天空属于哈夫克33 天前
打造私域闭环:CRM 如何驱动企微外部客户触达
自动化·企业微信·api