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 整体环境架构图

下面这张图,把咱们这一章搭建的环境串起来。你看看,心里就有数了。

座舱自动化测试环境架构 Pytest 测试用例 Pytest 插件体系:html | xdist | rerunfailures | ordering | allure uiautomator2 / Appium 驱动 ADB 桥接层 真车机 / Android设备 模拟器 (AVD/Genymotion) 说明:测试用例通过Pytest插件调用驱动层,驱动层经ADB与设备通信,实现自动化操作

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。每次新环境部署完,先跑它。绿了再往下走,红了先排查环境问题,别急着写用例。