3. 自动化测试概述
说实话,很多做测试的同学一开始都栽在环境配置上。我记得刚带团队那会儿,有个同事花了两天装Python,结果发现装了两个版本,pip还用不了——嗯,这种坑我踩过不止一次。这一章咱们就把这些基础打扎实,后面写脚本才不慌。
3.1 Python环境配置
Python版本怎么选?我个人建议直接用Python 3.8以上。为什么?因为现在主流的座舱测试框架基本都支持3.8+,像我们团队用的pytest、Appium这些,3.6以下已经跑不起来了。
我的经验:Windows用户记得勾选"Add Python to PATH",不然命令行敲python会报"不是内部或外部命令"。Mac用户直接用brew install python@3.10,干净利落。
验证环境是否装好,打开终端敲两行命令:
python --version
pip --version
能看到版本号,说明环境通了。如果pip报错,八成是PATH没配好。
3.2 pip源设置
pip默认源在国外,下载速度慢得让人抓狂。我在项目里遇到过,一个requests库下了五分钟还没完。解决办法很简单——换国内镜像源。
常用的几个源:
| 源名称 | URL | 推荐场景 |
|---|---|---|
| 清华源 | https://pypi.tuna.tsinghua.edu.cn/simple | 通用,稳定 |
| 阿里源 | https://mirrors.aliyun.com/pypi/simple | 速度最快 |
| 中科大源 | https://pypi.mirrors.ustc.edu.cn/simple | 教育网友好 |
永久设置方法(推荐):
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
临时用的话,安装时加 -i 参数就行:
pip install requests -i https://mirrors.aliyun.com/pypi/simple
小技巧:我习惯在项目根目录放一个pip.conf,这样不同项目可以用不同源。团队协作时特别方便,大家拉下来直接用,不用各自配。
3.3 虚拟环境管理
为什么要用虚拟环境?说白了就是隔离依赖。你想想看,项目A用Django 2.2,项目B用Django 4.0,装在一起肯定打架。虚拟环境就是给每个项目一个独立的"小房间"。
Python自带的venv就够用:
# 创建虚拟环境
python -m venv venv
# 激活(Windows)
venv\Scripts\activate
# 激活(Mac/Linux)
source venv/bin/activate
# 退出
deactivate
激活后,终端前面会出现 (venv) 标识,这时候pip安装的所有包都只在这个环境里生效。
避坑指南:我曾经把虚拟环境目录提交到Git仓库,结果队友拉下来后路径全乱了。记住,venv目录要加到.gitignore里。依赖管理用requirements.txt:
pip freeze > requirements.txt
我推荐用pipenv或者poetry管理依赖,但新手先用venv+requirements.txt,等熟悉了再升级。
3.4 常用内置库
Python内置库就是"开箱即用"的工具箱。写座舱测试脚本时,下面三个库几乎天天用。
3.4.1 os库——文件和路径操作
os库最常用的场景是拼接路径、判断文件是否存在、遍历目录。我写测试脚本时,经常用它来读取测试数据文件。
import os
# 获取当前脚本所在目录
current_dir = os.path.dirname(__file__)
# 拼接路径(自动处理不同系统的分隔符)
data_path = os.path.join(current_dir, "data", "test_cases.json")
# 判断文件是否存在
if os.path.exists(data_path):
print("文件存在")
else:
print("文件不存在,请检查路径")
# 遍历目录
for root, dirs, files in os.walk(current_dir):
for file in files:
if file.endswith(".json"):
print(os.path.join(root, file))
注意:不要用字符串拼接路径,比如 current_dir + "/data/" + filename。Windows和Mac的路径分隔符不一样,os.path.join会自动处理。我见过太多因为路径问题导致的脚本报错了。
3.4.2 sys库——系统参数和退出
sys库最常用的是sys.argv和sys.exit。写命令行工具时,argv用来接收参数,exit用来控制退出码。
import sys
# 获取命令行参数
# 假设运行:python test_script.py --device emulator --log-level debug
script_name = sys.argv[0] # test_script.py
device = sys.argv[1] # --device
device_value = sys.argv[2] # emulator
# 简单参数解析(实际项目用argparse更规范)
if "--device" in sys.argv:
idx = sys.argv.index("--device")
device_name = sys.argv[idx + 1]
print(f"测试设备:{device_name}")
# 退出脚本并返回状态码
# 0表示成功,非0表示失败
if not device_name:
print("错误:未指定设备")
sys.exit(1)
我在做座舱自动化测试时,经常用sys.exit(1)来标记测试失败,这样CI/CD流水线能自动识别。
3.4.3 subprocess库——执行系统命令
subprocess用来在Python里跑系统命令。比如启动模拟器、抓取日志、执行adb命令。
import subprocess
# 执行命令并获取输出
result = subprocess.run(
["adb", "devices"],
capture_output=True,
text=True,
timeout=10
)
print(result.stdout) # 标准输出
print(result.returncode) # 返回码,0表示成功
# 检查adb是否连接设备
if "device" in result.stdout:
print("设备已连接")
else:
print("未检测到设备")
# 实时输出(适合长时间运行的命令)
process = subprocess.Popen(
["adb", "logcat", "-c"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
# 等待命令完成
process.wait()
避坑指南:我曾经用os.system("adb reboot"),结果脚本卡死了。因为os.system会阻塞直到命令执行完,而adb reboot不会自动退出。改用subprocess.run并设置timeout参数,就能避免这种问题。
3.5 知识体系总览
下面这张图把本章的核心知识点串起来了,方便你对照复习:
3.6 本章小结
这一章的内容说白了就是"磨刀不误砍柴工"。环境配好了,源设对了,虚拟环境用上了,后面写测试脚本才能顺风顺水。os、sys、subprocess这三个库,我几乎每个测试脚本都会用到,你练熟了就会发现——嗯,其实Python没那么难。
个人建议:别急着往下学,先把环境配好,跑通上面的代码示例。我见过太多人"眼高手低",结果写脚本时卡在路径问题上。基础打牢,后面才快。