软件测试进阶篇----移动端测试

软件测试进阶篇----移动端测试

一、移动端测试概述

移动端测试不是一个新的领域,所采用的测试的理论、原则和方法、技术和之前web的是一样的。

移动端的手工测试,和web端的点点点是一样的。

移动端的自动化测试,python+appium+unittest/pytest+ddt+BeautifulReport/allure+git/gitee+jenkins

1、移动端设备

当前大部分移动端测试是属于嵌入式测试范畴的,包括移动端的应用(app,小程序)测试以及移动端设备测试

手机(手机终端测试)智能穿戴设备(手环、手表、眼镜、AR设备)车机交互、车载pad、扫地机器人

2、移动端操作系统(os)

Androidios鸿蒙os4xiaomi澎湃os黑莓windows phone塞班4、5/米狗

3、移动端应用(app)

这个是软件测试工程师的主要测试对象,以Android为例:

原生app:以Android、iOS、鸿蒙提供的开发环境直接开发的app,数据处理能力比较强混合开发app:数据处理使用Android,页面展示用的H5技术(更好看)web app:纯H5技术开发的app小程序:

微信小程序:随用随装、不同卸载支付宝小程序今日头条小程序百度小程序

二、移动端测试的要点(重点)

1、安装和卸载测试

web端也是需要安装和卸载测试的:

测试环境下,可以根据用户安装手册完成一次部署上线之前的预发布环境中,要完整的执行一次安装过程(预演),上线安装就安全了。内存不足的时候有没有提示是否安装在了指定的文件夹下、是否有多余的文件夹生成在安装过程中有电话打入、短信、消息、闹钟等事件的中断服务器端的安装:金丝雀发布/灰度发布的方式客户端app的安装:(重点)

Android:

通过各种渠道获取apk文件,即可安装

iOS:

安装包的后缀是ipa文件app已经获取到苹果发的企业证书,是可以随便装的**上线appstore,下载安装****在测试环境中,将iphone收集的udid编号,给开发,开发打包在app中,该iphone就可以安装了****testflight是苹果提供内测工具,开发组通过testflight给对应测试人员账号发邮件,获取验证码并下载安装**

web端的系统卸载:

应用程序包(文件夹),直接删除即可对应的数据库也要手动卸载redis软件支持,也需要删除

移动端的app卸载:

直接卸载检查卸载是否完整、干净(不能有多余的文件夹、缓存数据)

2、UI测试点

在UI页面展示上的不合理的内容、测试点:

要检查页面上是否有错别字要检查页面布局风格:横向上风格要一致,按钮、标签、图片大小和样式要相同页面颜色不能三种以上比较艳丽的颜色文字不能超出所在标签的位置:文字超出文本框的范围,overlap标签与标签之间叠加在一起了,cutoff不允许出现违法、敏感的文字和图片中文字符的支持一些英文单词不能过度翻译:logo

3、app功能性测试(重点)

app安装完成之后是否能正常启动app启动时的广告页显示是否正常、倒计时、跳过功能是否正常注册功能登录功能注销功能前后端切换app,检查是否可用

先正常使用app,切到后台,再从后台切回到前台先正常使用app,切到后台,锁屏,解开屏幕,再从后台切回到前台正常使用app,接电话,回来继续使用正常使用app,弹窗了,切回后台,再回来…

登录及免登录的测试数据更新软件更新相机、通讯录、录音机等功能的使用push消息通知测试交叉事件测试

打电话发短信发邮件闹钟

4、兼容性测试(重点)

做兼容性测试的目的是:app可以在不同的手机能正常使用(覆盖市场主流的50+手机以上)

1)需要兼容的要素

和软件的兼容和硬件的兼容

品牌(华为、小米、苹果等)屏幕大小不同:6.X网络制式os系统兼容

iOS:14、15、16等最新三个版本Android:13、14、15版本鸿蒙:1、2、3、4澎湃os:基于Android深度开发的

2)怎么做兼容性测试

兼容性测试一定要采用真实的设备进行测试。

公司没钱买:借手机没钱不想借:租手机,在线的云测平台(20+自备和50+平台租赁)。

testin腾讯wetest优测蒲公英

公司不差钱:买,买最新的(可以是二手的)

3)兼容性测试关注的三个主要问题

Exception:异常ANR:应用程序未响应Crash:崩溃、闪退

4)app专项测试数据(记住)

app耗电量测试app流量测试app内存占用app的cpu占用游戏app测试关注帧率电池温度测试

三、Android系统概述

1、Android系统架构

应用程序层:计算器、qq、微信、支付宝等,主要用的是Android、H5应用程序框架层:进行Android开发的支持的框架,java函数库层(c++、java)Linux内核层

进程调度(SCHED)内存管理(MM)虚拟文件系统(VFS)网络接口(NET)进行间通信(IPC)

2、Android app的四个组件

每一个Android的app都是由四部分组成的。

1)activity:活动

每个app的一屏内容就称之为活动,相当于web中的一个页面,负责页面展示效果

2)service:服务

在app第一次启动的时候启动起来,主要负责数据的处理

3)content-provide:内容提供者

Android系统中的一个数据中转站

4)broadcast receiver:广播接收器

消息推送到Android系统

四、移动端测试环境搭建

本章讲的是Android环境的搭建,实现对Android移动端app的手工测试环境和自动化测试环境。

jdk环境和环境变量配置

jdk:java开发工具包,是java语言开发的基础环境,也是java开发的程序运行的环境

环境变量:jdk的bin目录;jdk下jre的bin目录配置到环境变量path里面

adt工具

adt:Android开发工具,包括Android模拟器和开发工具(adb的工具)

解压压缩包即可使用。

安装夜神模拟器

把夜神模拟器下的bin\adb.exe文件复制到adt-bundle-windows/sdk/platform-tooks下替换adb.exe

验证环境:cmd输入adb—显示版本号1.0.36即成功

一、adb工具的使用

adb:android debug bridge,作用是通过电脑端控制Android设备端的一个工具。

通过adb,就可以在pc端方便地进行手机/模拟器的操作了

1、连接设备

设备可以是Android的模拟器、Android手机、Android的其他移动端设备,不能是iOS的,可以是鸿蒙的(兼容Android)

连接设备:adb connect 127.0.0.1:62001,提示—already connected to 127.0.0.1:62001

断开连接设备:adb disconnect 127.0.0.1:62001,提示—disconnected 127.0.0.1:62001

2、查看连接到adb的Android设备名称信息(必背)

adb devices,提示—List of devices attached

127.0.0.1:62001 device

127.0.0.1:62001:设备名,序列名

device:当前设备的状态,是正常连接状态

3、查看设备状态

adb get-state

设备的状态有4种,device,offline,unknown,unauthorizathion

device:设备正常连接offline:连接出现异常,设备无响应unknown:没有连接设备unauthorizathion:未授权,连接手机的时候会出现

4、开启/关闭adb服务

adb start-server

adb kill-server

5、获取Android日志文件

adb logcat -v time *:E > d:\aa.log-v time:在日志文件中添加日志记录的时间戳*:E:过滤日志等级为Error等级以上. > :重定向符号,是将cmd命令行的数据写入到外部文件

6、adb挂载到Android底层Linux内核上

adb shell

7、app的安装和卸载

安装的命令:从PC端通过adb的命令推送apk文件到Android设备并完成安装的过程

安装的命令:adb install PC端本地的apk文件的全路径

卸载的命令:adb uninstall 包名(在Android中包名就是指的进程、软件名)

8、文件推送(下载和上传)

将PC端本地文件上传到Android模拟器或者手机上、将模拟器、手机的文件下载到PC端。

上传命令:adb push 本地文件全路径 远程存放文件的目录

下载命令:adb pull 远程文件的全路径 本地存放目录(不要是根目录)

9、获取包名/activity名

1)adb shell —>cd /data/data

获取Android设备中安装的所有的api的包名

2)获取处于焦点状态的某个app的包名

需要先将app打开,并处于焦点状态

adb shell dumpsys window | findstr mCurrentFocus

3)获取Android设备安装的包名、第三方包名

adb shell pm list package

adb shell pm list package -3

10、启动app

adb shell am start -n 包名/活动名

二、monkey工具的使用

1、monkey简介

monkey测试:猴子测试、随机测试,在不清晰测试技术、不懂软件系统业务的情况的随意测试

monkey工具:其实是Android系统自带的一个小工具,也是可以通过adb命令启动,生成大量随机事件对Android设备的app页面进行操作,比如大量的点击事件、滑动事件、旋转事件、手势事件、按键等,最终想实现的是对app前端应用的稳定性测试(大量事件、长时间、不间断)、性能测试。

主要监控的指标:

Exception:异常ANR:应用程序未响应Crash:崩溃、闪退

2、monkey工具随机测试(掌握)

参考文章:https://zhuanlan.zhihu.com/p/133858779

1)查看monkey帮助文档

基本的格式:adb shell monkey 参数列表 随机事件数量

2)-p指定可以操作的包

不指定-p:所有的包都可以被随机操作指定一个-p:只能操作指定的这个包名的应用指定多个-p:给指定的多个应用发送随机事件

3)-v日志详情

-v:显示注入事件比例及列表等

-v -v:显示更多的信息

4)-s:种子数

monkey是随机的,如果出现了bug,如何复现怎么搞?

如果指定固定的-s值,随机事件的类型和顺序就是固定了

5)–throttle 数字,单位ms

主要是在事件之间增加了延时作用。

下面的是事件比例调整的参数:

6)触摸事件调整参数:- -pct-touch 比例值(0~100)

触摸事件不单单是按键,它泛指发生在某一位置的一个down-up事件。

7)手势事件:- -pct-motion 比例值

手势事件是在屏幕上的滑动

8)- -pct-appswitch:更改用于切换app的不同页面的事件比例

9)- -pct-rotation 后面接屏幕旋转事件的比例值

10)- -ignore-timeouts

在monkey运行过程中如果出现超时异常,需要忽略异常,继续发送事件直到所有的事件发完

11)- -ignore-crashes

在monkey运行过程中如果出现闪退异常,需要忽略异常,继续发送事件直到所有的事件发完

三、monkey进行app的自动化测试(自定义脚本测试)了解

移动端自动化测试的常见测试工具:

Appium工具:非常主流的免费的自动化工具,支持Android和iOS端的自动化uiautomator工具:录制脚本airtest:网易的一个自动化框架,支持python语言,支持录制和编程

1、简介

appium包括两部分:

appium客户端:appium是封装了selenium(webdriver api)方法的一个客户端软件(专有的方法),支持多种语言的,python、java、js等appium服务器端:处理客户端请求的,转交请求给Android设备的app去执行

windows版本Linux版本macOS版本

2、appium进行自动化测试的环境搭建

node.js的安装

是appium server的支持语言环境。安装指定版本即可

appium的服务器端

配置jdk和sdk的家目录

设置host端口(127.0.0.1和4723)

启动服务

最小化放在任务栏即可,不能关闭

appium客户端的安装

cmd—>pip install appium-python-client

夜神模拟器

jdk环境安装和环境配置

pycharm ide集成开发环境

3、自动化测试脚本开发

selenium+appium+jdk的版本不同可能导致执行结果不同。

1、老版本组合

selenium(4.9版本及以前)、appium-python-client(2.6.0及以前)、jdk8,appium-server管理员权限运行。

# android模拟器上的计算器app的自动化脚本:1+1=2

# 导包

from appium import webdriver

from appium.webdriver.common.appiumby import AppiumBy

import time

import appium

# 实现逻辑代码

# 先定义测试对象的参数,定义在一个字典中

desired_capabilities = {

# 定义被测对象所处的平台名是什么:Android、iOS、FirefoxOS

"platformName":"Android",

# 定义android系统的版本号

"platformVersion":"5.1.1",

# 定义你的被测对象是手机设备还是模拟器,也可以填adb devices

"deviceName":"Android Emulator",

# 不允许app重置数据

"noReset":True,

# 要操作的app的包名

"appPackage":"com.lilysgame.calculatorjw",

# 要操作的acitvity名

"appActivity":"com.lilysgame.calculator.MainActivity"

}

# 创建appiumdriver对象

# 将定义好des的参数发送给appium server,帮我们找到当前环境下是否有可用的设备和app并能连上设备

# 到目前位置,是可以实现模拟器上的app正常启动

driver = webdriver.Remote(r"http://127.0.0.1:4723/wd/hub",desired_capabilities= desired_capabilities)

time.sleep(10)

# 对app的操作:1+1=2

# 识别并点击按钮1

# 使用id属性定位按钮1,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnOne').click()

time.sleep(2)

# 使用id属性定位按钮+,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnAdd').click()

time.sleep(2)

# 使用id属性定位按钮1,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnOne').click()

time.sleep(2)

# 使用id属性定位按钮=,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnEqual').click()

time.sleep(2)

# 断言

yq = "2"

sj = driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/et_show').get_attribute("text")

assert yq==sj

# 关闭appium driver对象

driver.quit()

2、新版本组合

selenium(4.9以后)、appium-python-client(3.1.0及以后)、jdk8,appium-server管理员权限运行。

# android模拟器上的计算器app的自动化脚本:1+1=2

# 导包

from appium import webdriver

from appium.webdriver.common.appiumby import AppiumBy

import time

from appium.options.common import AppiumOptions

import appium

option = AppiumOptions()

option.set_capability("platformName","Android")

option.set_capability("platformVersion","5.1.1")

option.set_capability("deviceName","Android Emulator")

option.set_capability("noReset",True)

option.set_capability("appPackage","com.lilysgame.calculatorjw")

option.set_capability("appActivity","com.lilysgame.calculator.MainActivity")

# 创建appiumdriver对象

# 将定义好des的参数发送给appium server,帮我们找到当前环境下是否有可用的设备和app并能连上设备

# 到目前位置,是可以实现模拟器上的app正常启动

driver = webdriver.Remote(r"http://127.0.0.1:4723/wd/hub",options=option)

# 对app的操作:1+1=2

# 识别并点击按钮1

# 使用id属性定位按钮1,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnOne').click()

time.sleep(2)

# 使用id属性定位按钮+,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnAdd').click()

time.sleep(2)

# 使用id属性定位按钮1,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnOne').click()

time.sleep(2)

# 使用id属性定位按钮=,并执行点击操作

driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/btnEqual').click()

time.sleep(2)

# 断言

yq = "2"

sj = driver.find_element(AppiumBy.ID,'com.lilysgame.calculatorjw:id/et_show').get_attribute("text")

assert yq==sj

# 关闭appium driver对象

driver.quit()

3、结合unittest框架实现

# selenium4.9以后版本AppiumOptions()\ChromeOpthons()

# appium-python-client用最新的3.1版本以上了

# jdk还是采用jdk8版本

# unittest框架

from appium import webdriver

# selenium4.9以上需要

from appium.options.common import AppiumOptions

from appium.webdriver.common.appiumby import AppiumBy

import time

import unittest

class calctest02(unittest.TestCase):

def setUp(self):

# 创建option对象

self.option = AppiumOptions()

self.option.set_capability("platformName","Android")

self.option.set_capability("platformVersion","5.1.1")

self.option.set_capability("deviceName","Android Emulator")

self.option.set_capability("noReset",True)

self.option.set_capability("appPackage","com.lilysgame.calculatorjw")

self.option.set_capability("appActivity","com.lilysgame.calculator.MainActivity")

# 创建Appium服务器的对象

self.driver = webdriver.Remote(r"http://127.0.0.1:4723/wd/hub",options=self.option)

# 隐式等待

self.driver.implicitly_wait(10)

def test_01(self):

'''实现计算器应用的加法运算'''

self.driver.find_element(AppiumBy.ID,"com.lilysgame.calculatorjw:id/btnOne").click()

time.sleep(2)

self.driver.find_element(AppiumBy.ID,"com.lilysgame.calculatorjw:id/btnAdd").click()

time.sleep(2)

self.driver.find_element(AppiumBy.ID,"com.lilysgame.calculatorjw:id/btnTwo").click()

time.sleep(2)

self.driver.find_element(AppiumBy.ID,"com.lilysgame.calculatorjw:id/btnEqual").click()

time.sleep(2)

# 断言

yq = "3"

sj = self.driver.find_element(AppiumBy.ID,"com.lilysgame.calculatorjw:id/et_show").get_attribute("text")

self.assertEqual(yq,sj)

def tearDown(self):

self.driver.quit()

if __name__ == '__main__':

unittest.main()

4、结合pytest框架实现

# selenium4.9以后版本AppiumOptions()\ChromeOpthons()

# appium-python-client用最新的3.1版本以上了

# jdk还是采用jdk8版本

# pytest框架实现代码

from appium import webdriver

# selenium4.9以上需要

from appium.options.common import AppiumOptions

from appium.webdriver.common.appiumby import AppiumBy

import time

import pytest

import os

class Test_qq():

def setup(self):

# 创建option对象

self.option = AppiumOptions()

self.option.set_capability("platformName","Android")

self.option.set_capability("platformVersion","5.1.1")

self.option.set_capability("deviceName","Android Emulator")

self.option.set_capability("noReset",True)

self.option.set_capability("appPackage","com.tencent.mobileqq")

self.option.set_capability("appActivity","com.tencent.mobileqq.activity.LoginActivity")

# 创建Appium服务器的对象

self.driver = webdriver.Remote(r"http://127.0.0.1:4723/wd/hub",options=self.option)

# 隐式等待

self.driver.implicitly_wait(10)

def test_01(self):

'''实现计算器应用的加法运算'''

# 使用id定位,定位登录按钮

# resource-id属性对应id定位方法

self.driver.find_element(AppiumBy.ID,"com.tencent.mobileqq:id/btn_login").click()

time.sleep(2)

# content-desc属性对应的是ACCESSIBILITY_ID定位方法

self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"请输入QQ号码或手机或邮箱").send_keys("2659160000")

time.sleep(2)

# xpath定位

self.driver.find_element(AppiumBy.XPATH,'//android.widget.EditText[@content-desc="密码 安全"]').send_keys("1234567890")

# id定位登录按钮

self.driver.find_element(AppiumBy.ID,"com.tencent.mobileqq:id/login").click()

time.sleep(10)

# 断言

yq = "验证码"

sj = self.driver.find_element(AppiumBy.ID,'com.tencent.mobileqq:id/ivTitleName').get_attribute("text")

assert yq==sj

def teardown(self):

self.driver.quit()

if __name__ == '__main__':

# pytest.main(["--alluredir","./testresult"])

# os.system("allure generate ./testresult -o ./testreport --clean")

pytest.main(["-v"])

五、ADB连接手机真机

每个品牌手机的设置不尽相同,

1)开启手机的开发者模式(设置-系统-全部参数-miui14,连续点击3次以上,显示已经开启了开发者模式)

2)进入开发者模式(设置中搜索:开发者)

3)开启USB调试,会弹出一个授权框,一定要确认授权。

4)PC端,就可以使用adb devices查看手机设备了

5)其他的adb命令就可以使用了(不是所有的,因为有手机的权限问题)

相关推荐

英雄联盟新手位置推荐 LOL新手一般玩什么好
365bet体育投注地

英雄联盟新手位置推荐 LOL新手一般玩什么好

📅 07-19 👁️ 2822
王者荣耀智能施法设置方法,自动释放技能战斗不用手
365bet体育投注地

王者荣耀智能施法设置方法,自动释放技能战斗不用手

📅 07-01 👁️ 1823
塞尔维亚世界杯冠军次数 附塞尔维亚世界杯历史战绩
beat365手机中文官方网站

塞尔维亚世界杯冠军次数 附塞尔维亚世界杯历史战绩

📅 07-11 👁️ 7276
丹麦与秘鲁比赛角球数据分析及战术探讨
beat365手机中文官方网站

丹麦与秘鲁比赛角球数据分析及战术探讨

📅 07-07 👁️ 3246
硫磺粉怎麼用
beat365手机中文官方网站

硫磺粉怎麼用

📅 07-24 👁️ 1758
六个苹果大约多少千克?不同品种重量差异大!
beat365手机中文官方网站

六个苹果大约多少千克?不同品种重量差异大!

📅 07-01 👁️ 384
wifi助理无法关闭
365bet体育投注地

wifi助理无法关闭

📅 07-09 👁️ 8852
学会了C语言,能开发什么?
beat365手机中文官方网站

学会了C语言,能开发什么?

📅 07-02 👁️ 9575
南极为什么冻不死企鹅?企鹅可以在零下多少度生存?
365游戏中心官网地址

南极为什么冻不死企鹅?企鹅可以在零下多少度生存?

📅 07-30 👁️ 6514