项目实战:pandas+pytest+allure+adb

目的:实现excel格式测试用例的自动化测试,用到什么记什么。

1. 环境搭建

1.1. 基本环境

adb
python
VSCode
Android设备
测试用例.xls

1.2. 所需依赖

批量安装项目依赖包,-r 是参数,全称 --requirement,作用是从指定文件中读取依赖列表并一键安装。

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

requirements.txt是一个纯文本文件,记录项目需要的所有依赖包及版本号。

# requirements.txt
pytest
pandas
openpyxl
opencv-python
numpy
loguru
allure-pytest
# 复写增加
pure-python-adb

# 示例:可指定版本
# requests==2.31.0
# pandas>=2.0.0

不创建txt文件,一次性安装多个包就直接把包名用空格隔开写在后面。

pip install pytest pandas

2. 测试用例规范化

测试用例八要素:

  1. 用例编号:唯一标识,方便定位、统计、追溯,如:CAM_PRE_001
  2. 用例标题:一句话说明测什么,如:后置摄像头正常预览
  3. 所属模块:归属功能模块,如:相机预览、变焦功能、拍照功能
  4. 前置条件:执行用例前必须满足的环境 / 状态,如:相机已打开、后摄模式
  5. 测试步骤:可复现的操作步骤,一步一步写清楚
  6. 预期结果:每一步执行后应该出现的正确结果
  7. 测试数据:用到的参数、配置、输入值,如:变焦倍数、分辨率、对焦位置
  8. 优先级:用例重要程度,一般分:P0(冒烟)、P1(核心)、P2(一般)、P3(次要)

3. pandas

菜鸟教程:https://www.runoob.com/pandas/pandas-tutorial.html

  1. 从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据
  2. 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征
  3. 广泛应用在学术、金融、统计学等各个数据分析领域

3.1. 安装

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2. 导入

import pandas as pd

3.3. 使用

3.3.1. 读取excel文件

Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。

  • Series 是一种类似于一维数组的对象,它由一组数据(各种 Numpy 数据类型)以及一组与之相关的数据标签(即索引)组成。
  • DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
# 从指定路径的.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. 安装

pip install pure-python-adb -i https://pypi.tuna.tsinghua.edu.cn/simple

4.1.2. 导入

from ppadb.client import Client as AdbClient

4.1.3. Client

# 默认: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

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. 导入

import uiautomator2 as u2
d = u2.connect()

d得到的就是设备对象,等价于 ppadb 的 device,内部已经建立了 ADB 连接,不需要再手动连 ADB
底层自动帮你做了所有事:

  1. 连接 ADB 服务
  2. 获取设备列表
  3. 如果连不上 → 自动尝试重启 adb
  4. 如果没有设备 → 直接抛明确错误
  5. 如果有多个设备 → 自动选第一个
  6. 最终直接返回给设备对象 d

4.2.3. 获取设备id

u2.connect() 默认取第一个设备,连多个设备必须用设备 SN 分别连接,每个设备都会得到独立的 d 对象(d1、d2),互不干扰。

import uiautomator2 as u2

# 连接设备1
d1 = u2.connect("123456")
# 连接设备2
d2 = u2.connect("789012")

未指明设备SN,可通过列表获取

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])
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() # 截图

ppadb VS uiautomator2

  • 简单命令、文件传输 → 用 ppadb
  • APP 自动化、点击文字、找控件、做项目 → 必须uiautomator2
对比项ppadb (pure-python-adb)uiautomator2
核心定位仅 ADB 命令执行,无 UI 识别支持文字、resourceId、控件定位
连接设备需手动获取设备、处理异常u2.connect() 一行完成
点击方式仅坐标 shell(input tap)坐标 + 文字 + ID 点击
元素判断不支持exists / wait 内置支持
截图先截手机再 pull直接保存到电脑 d.screenshot()
APP 操作手写 adb 命令内置 app_start/app_stop
文件传输支持 push/pull同样支持 push/pull
执行 shelldevice.shell()d.shell() 用法一致
多设备手动管理 SNu2.connect("设备SN") 直接指定
适合场景底层 ADB 命令、文件操作APP UI 自动化、弹窗、相机操作
代码简洁度繁琐,需大量异常处理极简,API 友好

4. pytest

4.1. 安装

pytest作为第三方库,需要另外进行安装。

pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple

4.2. 导入

import pytest

4.3. pytest VS unittest

pytest和unittest都是 Python 单元测试 / 接口自动化测试框架,但设计理念、写法、生态完全不同。

4.3.1. 对比图

在这里插入图片描述

4.3.2. 举例

pytest在使用上更简洁。

import unittest

class TestLogin(unittest.TestCase):
    def test_login_success(self):
        self.assertEqual(200, 200)   # 必须用自带断言
def test_login_success():
    assert 200 == 200  # 直接用Python原生断言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值