3. Python 测试环境搭建(virtualenv、pip)
好,进入正题。说实话,很多测试脚本写得好好的,一换机器就崩,八成是环境问题。我有个老朋友就吃过这个亏——他在自己电脑上跑得飞起的脚本,到了CI服务器上直接报错,查了一上午,结果发现是全局环境下装了一堆版本冲突的库。所以,搞集成测试第一件事,先把环境隔离做好。
3.1 认识两个核心工具:virtualenv 和 pip
先说说 pip。它是一个 Python 包管理工具,说白了就是帮你下载、安装、卸载第三方库的。Python 3.4 之后,pip 是自带的,省了不少事儿。
再说 virtualenv。它的作用更关键——创建一个独立的 Python 运行环境。每个项目都有自己的虚拟环境,互不干扰。
核心概念:
- pip:负责安装、管理 Python 包
- virtualenv:负责隔离项目环境
- 两者配合:在虚拟环境中用 pip 装包,包只属于这个环境
3.2 为什么非要环境隔离?
你想想看,一个项目用 requests 2.25,另一个用 requests 2.26。全局装哪个?装哪个另一边的项目就得出问题。
我在项目中遇到过最典型的情况:自动化测试脚本依赖 selenium 3.x,但运维那边统一装了 selenium 4.x,结果脚本跑起来全是 API 不兼容的报错。有了 virtualenv,每个项目的依赖完全隔离,各玩各的。
另一个好处:清理方便。测试环境乱掉了?直接把整个虚拟环境删掉,重新创建,干干净净。
3.3 动手搭建:安装与基础配置
3.3.1 确认 pip
先检查一下你的环境里 pip 能不能用。
pip --version
如果输出类似 pip 23.0.1 from ...,说明已经装好了。我个人习惯把 pip 先升到最新版,免得后面出什么奇怪的问题。
python -m pip install --upgrade pip
3.3.2 安装 virtualenv
用 pip 装 virtualenv 本身也走 pip。就这么一行:
pip install virtualenv
安装完成后,验证一下:
virtualenv --version
| 步骤 | 命令 | 说明 |
|---|---|---|
| 检查 pip | pip --version | 确认 pip 已安装 |
| 升级 pip | python -m pip install --upgrade pip | 避免版本过低导致依赖冲突 |
| 安装 virtualenv | pip install virtualenv | 全局安装 |
3.4 创建虚拟环境
到了最关键的一步。我们创建一个项目的虚拟环境。
# 我想把环境放在项目目录下的 venv 文件夹里
cd your_project_directory
virtualenv venv
等几秒钟,会出现一个 venv 的文件夹。里面包含 Python 解释器、pip、以及标准库的副本。
小技巧: 文件夹名字 venv 是惯例,你也可以叫别的。但团队协作时,统一用 venv 或者 .venv 比较省心。另外,记得把 venv/ 加到 .gitignore 里,别把环境文件传到代码仓库中。
3.4.1 激活虚拟环境
环境创建好了,但还没生效。你需要“激活”它。
Windows 环境:
venv\Scripts\activate
macOS / Linux 环境:
source venv/bin/activate
激活后,终端前面会出现 (venv) 的提示,说明你已经进入了虚拟环境。
3.4.2 退出虚拟环境
用完环境,记得退出。
deactivate
3.5 使用 pip 管理依赖
进入虚拟环境之后,你用 pip 安装的所有包都会装到这个环境里,不会影响全局。
pip install requests pytest pytest-html
一条命令安装多个包,中间用空格隔开就行。
3.5.1 锁定依赖:requirements.txt
这是团队协作的命根子。环境配好了,把包列表导出来,其他人一键就能复现你的环境。
导出当前环境的所有包:
pip freeze > requirements.txt
别人拿到这个文件,一键安装:
pip install -r requirements.txt
注意: pip freeze 会导出所有已安装的包及其版本号。这些版本号是锁定死的。曾经有一次,一个同事没锁版本,直接装最新版,结果我的代码里用了一个已被废弃的 API,项目直接挂了。所以,一定要锁版本。
3.5.2 只装需要的依赖
有时候只想装一部分依赖,可以预先在 requirements.txt 里写好,只写需要的顶层包(不写它的子依赖)。
示例 requirements.txt:
requests==2.28.0
pytest==7.1.2
pytest-html==3.1.1
这样安装时 pip 会自动解析子依赖,但主依赖的版本是锁死的。
3.6 我在项目中踩过的坑
避坑指南,这里直接上干货。
- 坑一:忘记激活环境。我曾经对着屏幕一脸懵逼,明明装了包却报 ModuleNotFoundError。结果发现我没激活虚拟环境,装到全局了。
- 坑二:操作系统差异。Windows 上激活虚拟环境的命令是
activate,Linux/macOS 是source activate。跨平台协作时,这真是个隐形地雷。 - 坑三:Python 版本不一致。virtualenv 默认用你创建环境时的 Python 版本。如果你项目的代码要求 Python 3.9,但你环境用的 Python 3.7,那跑起来也是各种毛病。创建时可以用
-p参数指定版本:virtualenv -p python3.9 venv。
3.7 pip 的高级技巧
掌握了基础的,再来点实用的。
3.7.1 换国内镜像源
pip 默认从国外官方源下载包,有时候慢得想摔键盘。换国内镜像能快出好几个数量级。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
也可以直接设成默认:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.7.2 查看已安装的包
pip list
这个命令会列出当前环境下所有已安装的包。
3.7.3 卸载不需要的包
pip uninstall requests
3.8 图解:整个环境搭建流程
下面这张图把整个流程串起来了。从安装 Python 开始,到最终编写测试脚本,虚拟环境和依赖管理是中间最关键的一环。
3.9 经验总结与最佳实践
环境搭建这个事情,看着基础,实则是整个测试框架的根基。我个人的几条经验,分享出来:
- 项目开局就建环境。不要等到代码写了一半再想起来隔离环境,那时候全局已经乱成一锅粥了。
- 提交代码前跑一次
pip freeze > requirements.txt。确保别人的环境能完美复现你的依赖。 - 为不同项目维护独立的虚拟环境。这是原则,没得商量。哪怕只是写个几行的小脚本,也值得建个环境。
- 虚拟环境的位置统一放在项目根目录下。团队协作时,约定俗成用
venv/或.venv/。这样大家一看就知道环境在哪里。
嗯,环境这块讲到这里,基本够用了。你把这些练熟,后面集成测试框架搭建的时候,依赖管理这块就不会出什么问题了。