文章目录
- [1. 环境搭建](#1. 环境搭建)
-
- [1.1. 基本环境](#1.1. 基本环境)
- [1.2. 所需依赖](#1.2. 所需依赖)
- [2. 测试用例规范化](#2. 测试用例规范化)
- [3. pandas](#3. pandas)
-
- [3.1. 安装](#3.1. 安装)
- [3.2. 导入](#3.2. 导入)
- [3.3. 使用](#3.3. 使用)
-
- [3.3.1. 读取excel文件](#3.3.1. 读取excel文件)
- [3.3.2. 数据类型转换](#3.3.2. 数据类型转换)
- [4. 设备通信](#4. 设备通信)
-
- 4.1.pure-python-adb (ppadb)
- [4.1.1. 安装](#4.1.1. 安装)
- [4.1.2. 导入](#4.1.2. 导入)
- [4.1.3. Client](#4.1.3. Client)
- [4.1.4. Device](#4.1.4. Device)
- [4.2. uiautomator2](#4.2. uiautomator2)
-
- [4.2.1. 安装](#4.2.1. 安装)
- [4.2.2. 导入](#4.2.2. 导入)
- [4.2.3. 获取设备id](#4.2.3. 获取设备id)
- [4. pytest](#4. pytest)
-
- [4.1. 安装](#4.1. 安装)
- [4.2. 导入](#4.2. 导入)
- [4.3. pytest VS unittest](#4.3. pytest VS unittest)
-
- [4.3.1. 对比图](#4.3.1. 对比图)
- [4.3.2. 举例](#4.3.2. 举例)
目的:实现excel格式测试用例的自动化测试,用到什么记什么。
1. 环境搭建
1.1. 基本环境
python
adb
python
VSCode
Android设备
测试用例.xls
1.2. 所需依赖
批量安装项目依赖包,-r 是参数,全称 --requirement,作用是从指定文件中读取依赖列表并一键安装。
python
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
requirements.txt是一个纯文本文件,记录项目需要的所有依赖包及版本号。
python
# requirements.txt
pytest
pandas
openpyxl
opencv-python
numpy
loguru
allure-pytest
# 复写增加
pure-python-adb
# 示例:可指定版本
# requests==2.31.0
# pandas>=2.0.0
不创建txt文件,一次性安装多个包就直接把包名用空格隔开写在后面。
python
pip install pytest pandas
2. 测试用例规范化
测试用例八要素:
- 用例编号:唯一标识,方便定位、统计、追溯,如:CAM_PRE_001
- 用例标题:一句话说明测什么,如:后置摄像头正常预览
- 所属模块:归属功能模块,如:相机预览、变焦功能、拍照功能
- 前置条件:执行用例前必须满足的环境 / 状态,如:相机已打开、后摄模式
- 测试步骤:可复现的操作步骤,一步一步写清楚
- 预期结果:每一步执行后应该出现的正确结果
- 测试数据:用到的参数、配置、输入值,如:变焦倍数、分辨率、对焦位置
- 优先级:用例重要程度,一般分:P0(冒烟)、P1(核心)、P2(一般)、P3(次要)
3. pandas
- 从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据
- 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征
- 广泛应用在学术、金融、统计学等各个数据分析领域
3.1. 安装
python
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2. 导入
python
import pandas as pd
3.3. 使用
3.3.1. 读取excel文件
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。
- Series 是一种类似于一维数组的对象,它由一组数据(各种 Numpy 数据类型)以及一组与之相关的数据标签(即索引)组成。
- DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
python
# 从指定路径的.xls/.xlsx文件中读取数据并加载为DataFrame结构。
df = pd.read_excel("test_cases/camera_cases.xlsx")
3.3.2. 数据类型转换
pytest 的数据驱动语法@pytest.mark.parametrize只认识、列表、元组、字典、字典列表,pandas转换得到的是DataFrame结构。
测试用例需要易读、易用、已维护。采取字典列表,一个字典对应一条用例,将所有用例放入一个列表中实现循环、遍历、逐条执行。
4. 设备通信
可选ppadb、uiautomator2、subprocess、os
4.1.pure-python-adb (ppadb)
纯 Python 实现的 ADB 客户端库,直接用 Python 代码控制 Android 设备,与本地 ADB 服务器(默认 127.0.0.1:5037)通信,不需要调用系统 adb 命令、不需要 subprocess。
4.1.1. 安装
python
pip install pure-python-adb -i https://pypi.tuna.tsinghua.edu.cn/simple
4.1.2. 导入
python
from ppadb.client import Client as AdbClient
4.1.3. Client
python
# 默认:127.0.0.1:5037
client = AdbClient()
# 常用方法
client.version() # ADB 版本
client.devices() # 所有已连接设备(列表)
client.device("序列号") # 根据 SN 取设备
client.kill() # 停止 ADB 服务
client.start_server() # 启动 ADB 服务
4.1.4. Device
python
device = client.devices()[0]
# 1. 执行 Shell(最常用)
output = device.shell("input tap 500 600")
# 2. 文件传输
device.push("本地路径/a.apk", "/sdcard/a.apk")
device.pull("/sdcard/screen.png", "本地保存路径")
# 3. 应用管理
device.install("test.apk")
device.uninstall("com.xxx.app")
device.is_installed("com.xxx.app")
# 4. 设备信息
device.serial # 序列号
device.model # 型号
4.2. uiautomator2
4.2.1. 安装
环境搭建及问题解决:https://blog.csdn.net/WEB___/article/details/135905550?spm=1011.2415.3001.5331
4.2.2. 导入
python
import uiautomator2 as u2
d = u2.connect()
d得到的就是设备对象,等价于 ppadb 的 device,内部已经建立了 ADB 连接,不需要再手动连 ADB
底层自动帮你做了所有事:
- 连接 ADB 服务
- 获取设备列表
- 如果连不上 → 自动尝试重启 adb
- 如果没有设备 → 直接抛明确错误
- 如果有多个设备 → 自动选第一个
- 最终直接返回给设备对象 d
4.2.3. 获取设备id
u2.connect() 默认取第一个设备,连多个设备必须用设备 SN 分别连接,每个设备都会得到独立的 d 对象(d1、d2),互不干扰。
python
import uiautomator2 as u2
# 连接设备1
d1 = u2.connect("123456")
# 连接设备2
d2 = u2.connect("789012")
未指明设备SN,可通过列表获取
python
import uiautomator2 as u2
# 获取所有已连接的设备 SN 列表
devices = u2.connect_adb().devices()
print(devices) # 输出 [('123456', 'device'), ('789012', 'device')]
# 分别连接
d1 = u2.connect(devices[0][0])
d2 = u2.connect(devices[1][0])
python
d = u2.connect() # 连接设备
d(text="文字").click() # 文字点击
d(resourceId="包名:id/xxx").click() # resourceId点击
d.click(x,y) # 坐标点击
d.shell("命令") # 发送 ADB 命令
d.app_start("包名")# 打开 APP
d.screenshot() # 截图
4. pytest
4.1. 安装
pytest作为第三方库,需要另外进行安装。
python
pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple
4.2. 导入
python
import pytest
4.3. pytest VS unittest
pytest和unittest都是 Python 单元测试 / 接口自动化测试框架,但设计理念、写法、生态完全不同。
4.3.1. 对比图

4.3.2. 举例
pytest在使用上更简洁。
python
import unittest
class TestLogin(unittest.TestCase):
def test_login_success(self):
self.assertEqual(200, 200) # 必须用自带断言
python
def test_login_success():
assert 200 == 200 # 直接用Python原生断言