移动端测试不是一个新的领域,所采用的测试的理论、原则和方法、技术和之前web的是一样的。
移动端的手工测试,和web端的点点点是一样的。
移动端的自动化测试,python+appium+unittest/pytest+ddt+BeautifulReport/allure+git/gitee+jenkins
当前大部分移动端测试是属于嵌入式测试范畴的,包括移动端的应用(app,小程序)测试以及移动端设备测试
这个是软件测试工程师的主要测试对象,以Android为例:
web端也是需要安装和卸载测试的:
客户端app的安装:(重点)
**上线appstore,下载安装**
**在测试环境中,将iphone收集的udid编号,给开发,开发打包在app中,该iphone就可以安装了**
**testflight是苹果提供内测工具,开发组通过testflight给对应测试人员账号发邮件,获取验证码并下载安装**
web端的系统卸载:
移动端的app卸载:
在UI页面展示上的不合理的内容、测试点:
做兼容性测试的目的是:app可以在不同的手机能正常使用(覆盖市场主流的50+手机以上)
1)需要兼容的要素
2)怎么做兼容性测试
兼容性测试一定要采用真实的设备进行测试。
3)兼容性测试关注的三个主要问题
4)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:android debug bridge,作用是通过电脑端控制Android设备端的一个工具。
通过adb,就可以在pc端方便地进行手机/模拟器的操作了
设备可以是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
adb devices
,提示—List of devices attached
127.0.0.1:62001 device
127.0.0.1:62001:设备名,序列名
device:当前设备的状态,是正常连接状态
adb get-state
设备的状态有4种,device,offline,unknown,unauthorizathion
adb start-server
adb kill-server
adb shell
安装的命令:从PC端通过adb的命令推送apk文件到Android设备并完成安装的过程
安装的命令:adb install PC端本地的apk文件的全路径
卸载的命令:adb uninstall 包名(在Android中包名就是指的进程、软件名)
将PC端本地文件上传到Android模拟器或者手机上、将模拟器、手机的文件下载到PC端。
上传命令:adb push 本地文件全路径 远程存放文件的目录
下载命令:adb pull 远程文件的全路径 本地存放目录(不要是根目录)
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
adb shell am start -n 包名/活动名
monkey测试:猴子测试、随机测试,在不清晰测试技术、不懂软件系统业务的情况的随意测试
monkey工具:其实是Android系统自带的一个小工具,也是可以通过adb命令启动,生成大量随机事件对Android设备的app页面进行操作,比如大量的点击事件、滑动事件、旋转事件、手势事件、按键等,最终想实现的是对app前端应用的稳定性测试(大量事件、长时间、不间断)、性能测试。
主要监控的指标:
参考文章:https://zhuanlan.zhihu.com/p/133858779
1)查看monkey帮助文档
基本的格式:adb shell monkey 参数列表 随机事件数量
2)-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运行过程中如果出现闪退异常,需要忽略异常,继续发送事件直到所有的事件发完
移动端自动化测试的常见测试工具:
node.js的安装
是appium server的支持语言环境。安装指定版本即可
appium的服务器端
配置jdk和sdk的家目录
设置host端口(127.0.0.1和4723)
启动服务
最小化放在任务栏即可,不能关闭
appium客户端的安装
cmd—>pip install appium-python-client
夜神模拟器
jdk环境安装和环境配置
pycharm ide集成开发环境
selenium+appium+jdk的版本不同可能导致执行结果不同。
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()
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()
# 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()
# 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"])
每个品牌手机的设置不尽相同,
1)开启手机的开发者模式(设置-系统-全部参数-miui14,连续点击3次以上,显示已经开启了开发者模式)
2)进入开发者模式(设置中搜索:开发者)
3)开启USB调试,会弹出一个授权框,一定要确认授权。
4)PC端,就可以使用adb devices查看手机设备了
5)其他的adb命令就可以使用了(不是所有的,因为有手机的权限问题)