注意:本项目已不再更新。因为重度依赖uiautomator2,只能实现 android 原生控件级别的测试,对于 H5、小程序等场景存在一些无法解决的困难。待重新实现"driver"后,再重启此项目。
pytest-android is a plugin for pytest that provides a configured 'driver' for Android Automated Testing, using uiautomator2.
pytest-android 是 pytest 的插件,它通过 uiautomator2 为 Android 自动化测试提供“驱动”。
- 整合 uiautomator2,实现基于控件的自动化测试
- 依赖 pytest-variables 实现参数化配置
- 借助 allure 生成测试报告
- 借助 hook 机制,实现“点击、滑动时自动截图”、“异常时自动抓取控件信息和截图”等 fixture,减少重复工作
- 通过安装 pytest 插件,实现诸如“失败重试”、“分布式执行”、“用例分层”等
强烈建议 使用 git 对代码进行版本控制,灵活运用分支开发的策略,并且将自动化整合进 DevOps 流程中。
推荐 本地开发使用基于virtualenv
的工具实现环境隔离和解决各个模块之间的依赖,如pipenv
。
建议 生产环境使用docker
对各个设备之间进行“隔离”。
macOS、linux可以通过 pyenv 实现多个 python 版本的共存和切换,Windows上需要下载可执行文件、手动安装和配置环境变量。
因为使用了 python 3.6 的 f-string 特性,所以建议的 python 版本大于等于3.6。
具体安装过程略。
mkdir demo
cd demo
推荐使用 pipenv 进行环境管理:
# macOS
brew install pipenv
# windows,linux
pip install --user pipenv
# 必须,根据您的配置文件格式,二选一(因为插件目前在 alpha 测试阶段,需要添加`--pre`参数)
# 注意,pipenv在2018.11.26版本之后,才能支持额外(extras)模块(即安装时的中括号语法),所以使用较新的版本、或手动安装
pipenv install --pre pytest-android[yaml] # yaml 作为配置文件,推荐
pipenv install --pre pytest-android[hjson] # json 作为配置文件
# 以下为可选模块,根据需要选择性安装
pipenv install weditor # uiautomator2 的录制工具
pipenv install allure-pytest # 使用 allure 生成报告
pipenv install pytest-rerunfailures # 使 pytest 支持失败重试
PS: pip版本大于等于18时,pipenv需要的最低版本为2018.11.26(如果低于此版本会导致一系列错误)
注意:根据这里的观点,pytest-android 作为 libraries,将部署到某个特定的环境中,然后才能使所有依赖项和子依赖项的确切版本具体化。
创建项目级配置文件,参考 config.yaml。此文件可以使用 yaml 和 hjson 格式(由 pytest-variables 插件实现),文件名任意。
配置文件可以同时指定多个(遇到相同字段,后面的会覆盖前面的),借助此功能可以实现:指定设备参数、实现复杂情况下的兼容性测试等。
创建 pytest 的配置文件,参考文档进行基础配置。
添加addopts = --variables config.yaml
,指定项目配置文件。
项目配置文件 config.yaml,pytest 配置文件 pytest.ini ,区别:
pytest.ini 只能有一个,且文件名不可修改;
config.yaml 可以有多个(通过 pytest-variables 插件实现,需在pytest.ini 中指定),文件名任意,并且可以同时载入多个文件(遇到重复字段时,最后一个生效)。
通过配置文件,可以对测试进行参数化配置,提高测试的灵活性,降低代码维护的工作量,和减少可能的疏忽导致的异常。
目前已实现命令行工具,可以直接执行命令下载对应的配置文件示例:
pipenv run python -m pytest_android download --init
如果已经手动创建,或者想重新下载指定的文件,可以附加对应的参数:
pipenv run python -m pytest_android download --pytest.ini
pipenv run python -m pytest_android download --config.yaml
当本地文件与示例文件不一致时,会提示是否覆盖,可以选择N然后手动合并。
如果使用 allure 生成报告,并安装了对应依赖,可以通过--alluredir
指定报告的路径,通过--clean-alluredir
指定开始前是否清理历史数据。更多参数可参考插件文档
如果借助 pytest-rerunfailures 插件实现失败重试,参考插件文档,添加--reruns
其他诸如 log 、markers,和第三方插件配置,根据需要参考对应文档。
此处文档可能更新不及时,通过执行命令python -m pytest --fixtures
,可以列出所有 fixtures 及其最新说明文档。
Name | Scope | Autouse | Description |
---|---|---|---|
driver | session | True | 初始化设备 |
show_case_name | function | True | toast 提示显示用例描述或名字,便于了解进度 |
app_start | function | True | 启动 app ,(仅)通过当前 app 包名判断是否启动 |
根据 pytest 的加载顺序,插件中定义的 fixture 是可以被 conftest.py
和本地插件pytest_plugins
覆盖的。也就是说,如果具体到项目时不满足需求,可以在工程内新建conftest.py
文件,编写同名 fixture,修改scope
、autoues
和其具体行为。
新建文件 test_demo.py
,输入以下代码:
#!/usr/bin/env python
# encoding: utf-8
from uiautomator2 import UIAutomatorServer
def test_233(driver: UIAutomatorServer):
print(driver.device_info)
运行:
pipenv run python -m pytest
如果插件使用中遇到问题,请通过 github issues 提交。
Distributed under the terms of the MIT license, "pytest-android" is free and open source software.
根据MIT许可条款分发,“pytest-android”是免费的开源软件。