3. 环境搭建与配置:Python虚拟环境创建、依赖管理、Pytest插件安装、ADB与模拟器配置
说实话,环境搭建这事儿,看着简单,但坑是真不少。我带过好几个新人,第一周全卡在环境上。不是Python版本冲突,就是ADB连不上设备。所以这一章,咱们把基础打扎实。
本章核心目标:在一台干净的机器上,从零搭建一套可复用的座舱自动化测试环境。包括Python虚拟环境、依赖锁定、Pytest插件体系、以及ADB与模拟器的联通。
3.1 Python虚拟环境:为什么必须用?
我刚开始做自动化时,图省事,直接在系统Python里pip install。结果呢?项目A要requests 2.25,项目B要requests 2.26,一升级,项目A挂了。你想想看,这多闹心。
虚拟环境就是给每个项目一个独立的Python解释器空间。互不干扰,干净利落。
3.1.1 创建虚拟环境
Python 3.3+ 自带 venv 模块,不需要额外安装。我个人习惯在项目根目录下创建:
# 进入你的项目目录
cd /workspace/cockpit_auto_test
# 创建虚拟环境,命名为 .venv(点开头,隐藏文件夹)
python3 -m venv .venv
执行完后,目录下会多出一个 .venv 文件夹。里面包含了独立的Python解释器和pip。
3.1.2 激活与退出
| 操作系统 | 激活命令 | 退出命令 |
|---|---|---|
| Windows (CMD) | .venv\Scripts\activate.bat |
deactivate |
| Windows (PowerShell) | .venv\Scripts\Activate.ps1 |
deactivate |
| macOS / Linux | source .venv/bin/activate |
deactivate |
小技巧:激活后,终端前面会出现 (.venv) 前缀。如果没看到,说明没激活成功。我曾经在Windows上折腾了半天,才发现PowerShell执行策略限制了脚本运行。用 Set-ExecutionPolicy Unrestricted -Scope Process 临时放开就行。
3.2 依赖管理:requirements.txt 的正确用法
依赖管理说白了就是「你家项目吃哪些库,版本是多少」。我见过最坑的团队,直接把所有依赖打在README里让人手动装。结果呢?版本对不上,跑不起来。
3.2.1 生成 requirements.txt
激活虚拟环境后,安装你需要的库。比如:
pip install pytest
pip install uiautomator2
pip install allure-pytest
然后一键导出:
pip freeze > requirements.txt
打开看看,内容大概是这样:
allure-pytest==2.13.2
allure-python-commons==2.13.2
attrs==23.1.0
certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.6
iniconfig==2.0.0
packaging==23.2
pluggy==1.4.0
pytest==8.0.2
requests==2.31.0
urllib3==2.2.1
uiautomator2==2.16.23
注意:pip freeze 会导出当前环境所有已安装的包。如果你在系统环境里执行,会把全局包也带进去。一定要在虚拟环境激活状态下操作。
3.2.2 从 requirements.txt 恢复环境
新同事拉代码后,只需要两步:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
搞定。所有依赖版本完全一致,不会出现「我这儿能跑你那儿跑不了」的情况。
3.2.3 依赖分组管理(进阶)
项目大了,依赖会分成几类:核心库、测试库、开发工具库。我个人习惯用 requirements 目录来管理:
requirements/
├── base.txt # 核心依赖:requests, uiautomator2
├── test.txt # 测试依赖:pytest, allure-pytest
└── dev.txt # 开发工具:black, flake8, pre-commit
然后在 test.txt 里引用 base.txt:
-r base.txt
pytest==8.0.2
allure-pytest==2.13.2
安装时:
pip install -r requirements/test.txt
3.3 Pytest插件安装:让测试框架更好用
Pytest本身很轻量,但配上插件就强大了。我常用的插件有这么几个:
| 插件名 | 用途 | 安装命令 |
|---|---|---|
pytest-html |
生成HTML格式测试报告 | pip install pytest-html |
pytest-xdist |
分布式执行测试用例(多核并行) | pip install pytest-xdist |
pytest-rerunfailures |
失败用例自动重跑 | pip install pytest-rerunfailures |
pytest-ordering |
控制用例执行顺序 | pip install pytest-ordering |
allure-pytest |
集成Allure报告框架 | pip install allure-pytest |
安装后,在 pytest.ini 或 conftest.py 里配置即可生效。比如并行执行:
# 命令行直接跑
pytest -n 4 # 用4个CPU核心并行跑
避坑指南:pytest-rerunfailures 和 pytest-xdist 一起用时,偶尔会有兼容问题。我曾经排查了一下午,最后发现是版本不匹配。建议锁定插件版本,不要用最新版。
3.4 ADB与模拟器配置:打通设备通信
座舱自动化测试,离不开ADB。不管是真车机还是模拟器,ADB都是桥梁。
3.4.1 ADB安装与验证
ADB包含在Android SDK Platform Tools里。下载后解压,把路径加到系统环境变量里。
验证是否安装成功:
adb version
# 输出类似:Android Debug Bridge version 1.0.41
3.4.2 连接模拟器
座舱测试常用模拟器有几种:
- Android Studio自带模拟器:功能全,但吃资源。
- Genymotion:速度快,适合跑自动化。
- 第三方车机模拟器:比如某些厂商定制的Android模拟器,带车载UI。
启动模拟器后,用ADB检查连接:
adb devices
# 输出:
# List of devices attached
# emulator-5554 device
如果显示 unauthorized,说明模拟器弹出了授权弹窗,在模拟器上点「允许」就行。
3.4.3 常用ADB命令(座舱测试版)
| 命令 | 用途 | 示例 |
|---|---|---|
adb shell input tap x y |
模拟点击坐标 | adb shell input tap 500 800 |
adb shell input swipe x1 y1 x2 y2 |
模拟滑动 | adb shell input swipe 300 500 300 200 |
adb shell am start -n pkg/activity |
启动指定应用 | adb shell am start -n com.android.settings/.Settings |
adb shell dumpsys window displays |
获取屏幕分辨率 | 用于计算点击坐标 |
adb shell screencap -p /sdcard/screen.png |
截屏 | 用于图像对比测试 |
注意:座舱屏幕分辨率通常不是标准的手机比例。比如1920x720这种带鱼屏。写死坐标的话,换个分辨率就废了。我建议用百分比或基于UI元素定位,别硬编码像素值。
3.5 整体环境架构图
下面这张图,把咱们这一章搭建的环境串起来。你看看,心里就有数了。
3.6 验证环境:跑一个最小用例
环境搭完,得验证一下能不能跑通。写一个最简单的测试:
# test_env_check.py
import pytest
def test_adb_connect():
"""验证ADB是否能连接到设备"""
import subprocess
result = subprocess.run(
["adb", "devices"],
capture_output=True,
text=True
)
assert "device" in result.stdout, "未检测到设备,请检查ADB连接"
def test_pytest_works():
"""验证Pytest本身能正常执行"""
assert 1 + 1 == 2
执行:
pytest test_env_check.py -v
如果两个用例都绿了,恭喜你,环境搭建成功。
我的习惯:我会把这个验证脚本放在项目根目录,叫 test_smoke.py。每次新环境部署完,先跑它。绿了再往下走,红了先排查环境问题,别急着写用例。