移动端自动化测试基础

https://blog.csdn.net/weixin_45912307/article/details/109282909

01 app操作api

1. 1ADB命令:

  1. adb --help 查看帮助文档
  2. adb start-server 启动服务
  3. adb kill-server 关闭服务
  4. adb devices 获取设备号
  5. adb shell getprop ro.build.version.release 获取版本号
  6. adb push 电脑端文件路径/需要发送的文件路径 手机存储的路径 向手机端发送文件
  7. adb pull 手机端路径/拉取文件名 电脑端存储文件的路径
  8. adb logcat 查看日志
  9. 获取app启动名
    mac/linux adb shell dumpsys window windows | grep mFocuseApp
    windows: adb shell dumpsys window w | findstr mCurrent
  10. adb install 路径/xxx.apk 安装应用
  11. adb shell am start -W 包名/.启动名
  12. 查看ip地址
    • adb shell ifconfig | grep Mask / adb shell ifconfig wlan0 /
    • adb shell netcfg
  13. adb shell cat /proc/cpuinfo 查看设备cpu信息
  14. adb shell cat /proc/meminfo 查看设备内存

1.2基本操作

  • driver.install_app()安装apk
  • driver.remove_app() 卸载apk
  • driver.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. 定位单个元素
  1. driver.find_element_by_id(id_value) # id_value:为元素的id属性值
  2. driver.find_element_by_class_name(class_value) # class_value:为元素的class属性值
  3. driver.find_element_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句
  4. Android端常用属性定位:
  • id ://*[contains(@resource-id,'com.android.settings:id/search')]
  • class ://*[contains(@class,'android.widget.ImageButton')]
  • text ://*[contains(@text,'WLA')]
  1. 模糊定位
  • 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.获取元素信息

  1. 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

  1. 获取手机时间
    driver.drive_time

  2. 获取手机宽高
    driver.get_window_size()

  3. 发送键到设备

方法:driver.keyevent(keycode, metastate=None):
参数:
    keycode:发送给设备的关键代码
    metastate:关于被发送的关键代码的元信息,⼀般为默认值
  1. 操作手机通知栏:打开手机通知栏,可以获取通知栏的相关信息和元素操作
    方法: driver.open_notifications()

  2. 获取当前手机网络
    方法:driver.network_connection

  3. 设置手机网络:更改手机的网络模式,模拟特殊网络情况

方法:driver.set_network_connection(connectionType)
参数:connectionType:需要被设置成为的⽹络类型
  1. 手机截图:截取手机当前屏幕,保存指定格式图片到指定位置
方法: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. 配置邮箱列表

  1. 点击增加构建后操作步骤,选择Editable Email Notification
  2. 点击Advanced Setting…
  3. 点击Trigger的高级按钮
  4. Recipient List输入邮件接收列表,多个邮箱逗号分隔
  5. 在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. 构建的三种状态:

  • 蓝色圆球代表构建成功
  • 红色圆球代表构建失败
  • 灰色圆球代表构建中断
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值