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 开始,到最终编写测试脚本,虚拟环境和依赖管理是中间最关键的一环。

Python 测试环境搭建流程 1. 安装 Python 2. 升级 pip 3. 安装 virtualenv 4. 创建虚拟环境 5. 激活并安装依赖 6. 编写测试脚本 关键文件 • requirements.txt • venv/ 目录 • .gitignore 配置 • 激活脚本

3.9 经验总结与最佳实践

环境搭建这个事情,看着基础,实则是整个测试框架的根基。我个人的几条经验,分享出来:

  1. 项目开局就建环境。不要等到代码写了一半再想起来隔离环境,那时候全局已经乱成一锅粥了。
  2. 提交代码前跑一次 pip freeze > requirements.txt。确保别人的环境能完美复现你的依赖。
  3. 为不同项目维护独立的虚拟环境。这是原则,没得商量。哪怕只是写个几行的小脚本,也值得建个环境。
  4. 虚拟环境的位置统一放在项目根目录下。团队协作时,约定俗成用 venv/ 或 .venv/。这样大家一看就知道环境在哪里。

嗯,环境这块讲到这里,基本够用了。你把这些练熟,后面集成测试框架搭建的时候,依赖管理这块就不会出什么问题了。