https://blog.csdn.net/weixin_45912307/article/details/109282909
移动端自动化测试基础
01 app操作api
1. 1ADB命令:
adb --help
查看帮助文档adb start-server
启动服务adb kill-server
关闭服务adb devices
获取设备号adb shell getprop ro.build.version.release
获取版本号adb push 电脑端文件路径/需要发送的文件路径 手机存储的路径
向手机端发送文件adb pull 手机端路径/拉取文件名 电脑端存储文件的路径
adb logcat
查看日志- 获取app启动名
mac/linuxadb shell dumpsys window windows | grep mFocuseApp
windows:adb shell dumpsys window w | findstr mCurrent
adb install 路径/xxx.apk
安装应用adb shell am start -W 包名/.启动名
- 查看ip地址
adb shell ifconfig | grep Mask / adb shell ifconfig wlan0 /
adb shell netcfg
adb shell cat /proc/cpuinfo
查看设备cpu信息adb shell cat /proc/meminfo
查看设备内存
1.2基本操作
driver.install_app()
安装apkdriver.remove_app()
卸载apkdriver.is_installed()
判断ak是否安装driver.push_file()
上传本地文件到手机driver.pull_file()
获取手机文件到本地driver.page_source()
获取页面源码
1.3. 手机操作
driver.device_time()
获取时间driver.get_window_size
获取手机屏幕大小driver.network_connection()
获取手机网络driver.set_network_connection()
设置网络driver.get_screenshot_as_file()
手机截屏
1.4. uiautomatorviewer工具使用
- 1.进入SDK目录下的tools目录,打开uiautomatorviewer
- 2.电脑连接真机或打开android模拟器
- 3.启动待测试app
- 4.点击uiautomatorviewer的左上⻆Device Screenshot,会生成app的UI控件截图
- 5.选择截图上需要查看的控件,即可浏览该控件的id,class,text,坐标等信息
1.5. 元素定位操作
1. 定位单个元素
driver.find_element_by_id(id_value)
# id_value:为元素的id属性值driver.find_element_by_class_name(class_value)
# class_value:为元素的class属性值driver.find_element_by_xpath(xpath_value)
# xpath_value:为可以定位到元素的xpath语句- Android端常用属性定位:
- id :
//*[contains(@resource-id,'com.android.settings:id/search')]
- class :
//*[contains(@class,'android.widget.ImageButton')]
- text :
//*[contains(@text,'WLA')]
- 模糊定位
contains(@key,value)
value可以是部分值
2. 定位一组元素
find_elements_by_id(id_value)
find_elements_by_class_name(class_value)
find_elements_by_xpath(xpath_value)
1.6. 显示等待
在一个超时时间范围内,每隔一段时间去搜索一次元素是否存在,
如果存在返回定位对象,如果不存在直到超时时间到达,报超时异常错误。
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
参数:
driver:手机驱动对象
timeout:搜索超时时间
poll_frequency:每次搜索间隔时间,默认时间为0.5s
method:定位方法(匿名函数)
1.7.获取元素信息
send_keys(vaue)
# value:需要发送到输入框内的文本
如果插入中文,需要在desired_caps里面增加2个参数
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
2. 清空输入框内容 clear()
3. 获取元素的文本内容 text
4. 获取元素的属性值 get_attribute(value)
# value:元素的属性
- value=‘name’ 返回content-desc / text属性值
- value=‘text’ 返回text的属性值
- value=‘className’ 返回 class属性值,只有 API=>18 才能支持
- value=‘resourceId’ 返回 resource-id属性值,只有 API=>18 才能支持
5. location 元素在屏幕上的坐标
- 获取app包名和启动名
- 获取包名方法:
current_package
- 获取启动名:
current_activity
1.8. 元素事件操作
1.swipe滑动事件
从一个坐标位置滑动到另⼀个坐标位置,是两个点之间的滑动.
方法: swipe(start_x, start_y, end_x, end_y, duration=None)
参数解释:
1.start_x:起点X轴坐标
2.start_y:起点Y轴坐标
3.end_x: 终点X轴坐标
4.end_y,: 终点Y轴坐标
5.duration: 滑动这个操作一共持续的时间长度,单位:ms
2.scroll滚动事件
从一个元素滚动到另外一个元素,直到页面自动停止
方法: scroll(origin_el, destination_el)
参数:
1. origin_el:开始位置
2. destination_el: 结束元素
3.drag拖拽事件
从一个元素滑动到另外一个元素,第二个元素替代第一个元素原本屏幕上的位置
方法: drag_and_drop(origin_el, destination_el)
参数:
1. origin_el:开始位置
2. destination_el: 结束元素
4. 将应用置于后台事件
方法: background_app(seconds)
参数:
seconds: 停留在后台时间,单位,秒
1.9. 模拟手势
1.手指轻敲操作
方法:
tap(element=None, x=None, y=None)
perform() # 发送命令到服务器执行操作
参数:
1.element:被定位到的元素
2.x:相对于元素左上⻆的坐标,通常会使⽤元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
2.手指按下操作
方法:
press(el=None, x=None, y=None)
release() # 结束动作,手指离开屏幕
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
3.等待操作
方法:
wait(ms=0)
参数:
ms暂停的毫秒数
4. 手指长按操作
方法:
long_press(el=None, x=None, y=None, duration=1000)
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
4.duration:持续时间,默认为1000ms
5. 手指移动操作
方法:
move_to(el=None, x=None, y=None)
参数:
1.el:定位的元素
2.x:相对于前一个元素的x轴偏移量
3.y:相对于前一个元素的y轴偏移量
1.10. 手机操作api
-
获取手机时间
driver.drive_time -
获取手机宽高
driver.get_window_size() -
发送键到设备
方法:driver.keyevent(keycode, metastate=None):
参数:
keycode:发送给设备的关键代码
metastate:关于被发送的关键代码的元信息,⼀般为默认值
-
操作手机通知栏:打开手机通知栏,可以获取通知栏的相关信息和元素操作
方法: driver.open_notifications() -
获取当前手机网络
方法:driver.network_connection -
设置手机网络:更改手机的网络模式,模拟特殊网络情况
方法:driver.set_network_connection(connectionType)
参数:connectionType:需要被设置成为的⽹络类型
- 手机截图:截取手机当前屏幕,保存指定格式图片到指定位置
方法:get_screenshot_as_file(filename)
参数:
filename:指定路径下,指定格式的图⽚.
02pytest
2.1. 安装命令: pip install -U pytest
2.2. 运行方式
- 测试类主函数模式:
pytest.main("-s test01.py")
- 命令行模式:
pytest 文件路径/测试文件名
2.3. pytest.ini配置文件内容
1.文件路径:
- Test_App
- - test_abc.py
- - pytest.ini
2.pyetst.ini配置文件内容:
[pytest]
# 命令行参数
addopts = -s --reruns 2 --html=./report.html
# 搜索文件名
python_files = test_*.py
# 搜索的类名
python_classes = Test_*
# 搜索的函数名
python_functions = test_*
2.4. 常用插件
1.pytest测试报告
安装: pip install pytest-html
命令行格式: pytest --html=存储路径/report.html
同时更改配置文件:
修改Test_App/pytest.ini文件,添加报告参数,即:addopts = -s --html=./report.html
参数解释:
-s是输出程序运行信息
—html=./report.html 在当前目录下生成report.html文件
⚠若要生成xml文件,可将--html=./report.html 改成 --html=./report.xml
2.Pytest 控制函数执行顺序
默认情况: 根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z
pytest执行基本原则:根据名称的字母逐一进行ASCII比较,越小越先执行。
多个测试模块(.py文件)时,根据基本原则执行。一个测试模块(.py文件)中,先执行测试函数,后执行测试类。多个测试类则遵循基本原则,类中的测试方法遵循基本原则。
作用: 以函数修饰符的方式标记被测函数,通过参数控制函数执行顺序
安装: pip install pytest-ordering
使用方法:
标记于被测函数, @pytest.mark.run(order=x)
根据order传入参数来决定运行顺序:
order值全为正数或全为负数时, 值越小,优先级越高
正数和负数同时存在,正数优先级高
总结: 0 > 较小整数> 较大的整数 > 无标记 > 较小的负数 > 较大的负数
3.失败重试
插件名称: pytest-rerunfailures
安装: pip install pytest-rerunfailures
使用: pytest --rerun n # n为重试的次数
修改配置文件:修改Test_App/pytest.ini文件,添加失败重试参数,即:addopts = -s --reruns 2 --html=./report.html
参数解释:
-s是输出程序运行信息
—rerun 2 : 失败重试2次
—html=./report.ml 在当前目录下生成report.html文件
2.5. fixture:用于完成预置处理和重复操作
1. fixture: 装饰器形式定义在函数上面
2. 作用: fixture修饰器,调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
3. 应用场景:
- 网站登录退出、
- 完成setup和teardown操作,处理数据库或文件的打开、关闭操作
- 准备测试数据.将数据提前写入数据库或通过params返回给测试用例
4. 使用方法:
pytest.fixture(scope='function', params=None, autouse=False, ids=None, name=None)
常用参数解释:
scope: 被标记方法的作用域;
"function": 默认值,表示每个测试方法都要执行一次
"class": 作用于整个类, 表示每个类的所有测试方法只运行一次
"module": 作用于整个模块, 每个module的所有测试方法只运行一次.
"session": 作用于整个session, 每次session只运行一次. ⚠️(此方法慎用!!)
params: list类型,默认None, 接收参数值,对于param里面的每个值,fixture都会去遍历执行一次.
autouse: 是否自动运行,默认为false, 为true时此session中的所有测试函数都会调用fixture
应用:
@pytest.mark.usefixtures("函数名") 作为函数应用
@pytest.fixture()
@pytest.fixture(autouse=True) # 设置为默认启动形式
@pytest.fixture(scope="function|class|module", autouse=True)
2.6. skipif跳过测试函数
应用场景: 根据特定条件、不执行标识的测试函数
方法:
skipif(condition, reason=None)
参数解释:
condition: 跳过的条件,必传参数
reason: 标注原因
使用方法:
@pytest.mark.skipif(condition, reason='xxx')
2.7. xfail 标记为预期失败函数
使用场景: 标记某测试函数会失败
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因
使用方法:
@pytest.mark.xfail(condition, reason="xxx")
2.8. 函数数据参数化
作用: 方便测试函数对测试属性的获取
方法:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名
argvalues:
- 参数对应值,类型必须为list
- 当参数为一个时,参数格式:[value]
- 当参数个数大于一个时,格式为:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
@pytest.mark.parametrize("a", [3,6])
03PO模式
04 Yaml
4.1. 语法规则
大小写敏感
使用缩进表示层级关系
缩进时不允许使用tab键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
4.2. 支持的数据结构
object(对象), 键值对的集合,又称为映射/hash/字典
array(数组), 一组按照次序排列的值,又称序列(sequence)、列表
scalars(纯量), 单个的、不可再分的值, 包括字符串、布尔值、整数、浮点数、null、日期
4.3. PyYAML库安装:
pip3 install -U PyYAML
4.4. 读取yaml文件
with open("./search_page.yaml", "r") as f:
data = yaml.load(stream, Loader=Loader)
#tream 是等待读取的文件对象
print(data)
4.5 写入yaml文件内容
with open('./yaml_hello.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, stream, **kwds)
# Data: 等待写入的数据,类型为字典
# stream: 打开文件对象
# encodig: utf-8, 设置写入的编码格式
# allow_unicode: True/False
05 Allure报告和Jenkins集成
5.1. 生成Allure所需要的用于生成测试报告的数据
pip install pytest-allure-adaptor
5. 2. xml转html工具安装
windows版本
1.下载压缩包allure-2.5.0.zip
2.解压
3.将压缩包内的bin目录配置到path系统环境变量
4.进入report上级目录执行命令:allure generate report/ -o report/html
5.report目录下会生成index.html文件,即为可视化报告
5.3. pytest中使用allure
1. 添加测试步骤: 便于在测试报告中明确的显示是第几步发生了错误
@allure.step(title="测试步骤001")
2. 添加测试描述信息: 能够清楚知道每一步执行的信息
allure.attach("描述", "我是测试步骤001的描述~~")
3. 添加严重级别
@pytest.allure.severity(Severity)
# 参数解释:
Severity: 严重级别(BLOCKER,CRITICAL,NORMAL,MINOR,TRIVIAL)
# 使用方式:
@pytest.allure.severity(pytest.allure.severity_level.CRITICAL)
5.4. Jenkins安装
1. jar包的方式安装
下载jenkins.jar
移动到要安装的目录,执行java -jar jenkins.war
代开浏览器输入: localhost:8080
2. 源码包安装
官网下载jenkins安装包
点击下一步,直到安装完成,会自动打开页面, 若没有打开,需要手动打开浏览器输入: localhost:8080
进入默认密码提示文件,输入系统默认的密码:
5.5Jenkins持续集配置
5.5.1Jenkins 安装allure插件生成测试报告
进入jenkins系统管理 -> 管理插件
点击可选插件
搜索框搜索Allure
选中安装
5.5.2. Jenkins 安装和配置AllureCommandline,来代替命令行操作
1.在Jenkins系统管理——> 全局工具管理
2.找到Allure Commandline,点击Allure Commandline安装
3.点击后,弹出如下页面, 输入一个别名
4.选择安装版本
5.点击新增安装-选择解压*.ip/*.tar.gz
6.解压目录选择已经下载好的allure2.5.0.zip所在目录(⚠️ 版本要和第4步的版本一致)
7.点击保存
5.5.3. 安装Git插件,配置和管理代码
1.在首页,点击创建任务, 创建一个自由风格项目—> 点击确定
2.输入项目描述
3.选择GitHub Project进行代码的管理
4.输入github的远程库名(⚠️在公司里要选择自己仓库名)
5.勾选git
6.Repository URL 输入和第4步一样
7.点击add添加github用户名和密码
5.5.4. 构建触发器并配置发送邮件
1.构建触发器
1. 在构建触发器选项框,选择POLL SCM, 根据需要勾选Build periodically选项
2. 在日程表填写crontab命令
日程表填写的参数的含义: * * * * *
第1个参数:分钟 minute,取值 0~59;
第2个参数:小时 hour,取值 0~23;
第3个参数:天 day,取值 1~31;
第4个参数:月 month,取值 1~12;
第5个参数:星期 week,取值 0~7,0 和 7 都是表示星期天;
3. 点击增加构建步骤,选择Execute shell
4. Command框输入:
export PATH=$PATH:'pytest可执行的目录'
pytest
2. 添加测试报告生成路径
构建后操作,点击增加构建后操作步骤,选择Allure Report
Path框输入,生成的报告文件夹名称, 注意:文件夹名要和pytest生成的报告文件夹名称一样
3. 配置邮箱列表
- 点击增加构建后操作步骤,选择Editable Email Notification
- 点击Advanced Setting…
- 点击Trigger的高级按钮
- Recipient List输入邮件接收列表,多个邮箱逗号分隔
- 在Jenkins系统中配置邮件
在系统全局配置中进行邮件配置, 要配置管理员的邮箱、发送/接收邮件的服务器、邮件接收人的邮箱列表.
配置邮件系统用户:
系统管理-系统设置-Jenkins Location
系统管理员邮件地址:用户名@163.com(发送邮件用户)
配置系统邮件:
系统管理-系统设置-邮件通知
SMTP服务器:例 smtp.163.com
用户默认邮件后缀:例如 @163.com
高级-使用SMTP认证
输入发送邮箱和密码 -可以使用测试邮件验证
配置(发送附件)邮件:
系统管理-系统设置-Extended E-mail Notification
SMTP server:例 smtp.163.com
Default user E-mail suffix:例如 @163.com
高级-Use SMTP Authentication - 输入发送邮件的邮箱和密码
Default Content Type: HTML(text/html)
Default Content(报告模版,使用以下html代码即可):
<hr/>(本邮件是程序自动下发的,请勿回复!)<hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
git版本号:${GIT_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
目录:${ITEM_ROOTDIR}<br/><hr/>
构建日志地址:<a href=" ">${BUILD_URL}console</a ><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a ><br/><hr/>
报告地址:<a href="${BUILD_URL}allure">${BUILD_URL}allure</a ><br/><hr/>
失败数:${FAILED_TESTS}<br/><hr/>
成功数:${FAILED_TESTS}<br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>
5.5.5. 进行项目构建,生成测试报告
1. 构建的2种方式:
- 手动触发构建
- 更新github代码,触发器在定时任务到达时,会触发项目构建
2. 构建的三种状态:
- 蓝色圆球代表构建成功
- 红色圆球代表构建失败
- 灰色圆球代表构建中断