软件测试笔记
移动应用测试
appnium使用
安装的是appnium-desktop,没有教程中所说的
Appium/node_modules/.bin/
路径,使用命令行输入appnium
和appium-doctor
也都没啥反应,后来索性没管,直接跑代码
真机测试
使用的时候报错Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
,以为是appnium版本的问题,第一次安装的是1.13,后来换成了1.9,其实没多大区别,只不过据说要保证版本在1.6以上。
更换版本后,发现还是Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
问题,于是试了多次,才终于解决。
步骤一:
这边是设置appnium连接参数的
由于群里的高分脚本也是这么设置的,我就以为没多大问题,其实这边还是要修改不少东西的
1 | //设置自动化相关参数 |
appPackage查看包名(可以找到唯一的应用):adb shell dumpsys activity | find "mFocusedActivity"
,需要的结果即cn.etouch.ecalendar
1 | adb shell dumpsys activity | find "mFocusedActivity" |
activityName查询类名(找到应用上的某个界面):aapt dump badging <apkPath>
然后找到launchable-activity
1 | e.g. |
步骤二:
除了代码上设置好连接手机的参数,手机也需要设置电脑能操作手机
需要打开三个选项:“USB调试”、“USB安装”、“USB调试(安全设置)”
以小米6手机为例:“更多设置”->“开发者选项”->“USB调试”、“USB安装”、“USB调试(安全设置)”
由于之前使用python玩过ADB,所以**“USB调试”、"USB调试(安全设置)"是开启的,而没打开USB安装**,所以导致了一直失败。实际上打开USB安装后,会安装几个程序比如Unlock、appnium settings等。其实报错一开始也提示了,没检测到手机,啥啥安装不上,只不过当时没留意
1 | Exception in thread "main" org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Unable to find an active device or emulator with OS 4.1.1. The following are available: cf46749d (8.0.0) (WARNING: The server did not provide any stacktrace information) |
▲后来又发现,不设置platformVersion、deviceName直接设置成Android Emulator也行,看来最主要的原因还是手机第一次使用Appnium之前需要安装写appnium的软件
这个应该就是这两行所安装的东西
1 | //设置使用unicode键盘,支持输入中文和特殊字符 |
夜深模拟器测试
1 开启USB调试
设置->关于平板电脑->多次点击"版本号"进入开发者模式->开发者选项->打开**“USB调试”和"允许模拟位置"**
2 查看deviceName
命令行中输入adb devices
,如果一直没检测到,解决方案如下(我是需要这么做的):
1 | 如果在设备连接过程中,确定设备已经开启USB调试且正确连接到PC,但是仍旧使用adb devices指令查到设备列表为空,则有可能是已安装的安卓SDK中的adb程序版本和模拟器自带的adb程序版本不一致导致的。 |
运行代码main.java
1 | //设置自动化相关参数 |
然后运行测试代码就能看到这样的画面了
进入元素审查
安装教程,我是安装软件测试大赛提供的教程安装下来的,只不过感觉这篇可能将的更好一点。( appium-doctor 是需要额外用npm安装的,而不是像比赛教程中写的那样)
踩坑记录:
出现报错UiAutomator exited unexpectedly with code 0, signal null
1 | adb shell |
adb unauthorized
1.使用adb连接手机时,即使打开了usb调试,手机添加了信任,仍然出现unauthorized的提示
2.C:\Users\(Username)\.android
里面删掉adbkey和adbkey.pub两个文件(没添加过信任的话是没有的),然后重新插拔手机
执行:
1 | adb kill-server |
△如果上述方式还是无效的话,选择“开发者测试”->"调试"中的撤销USB调试授权,然后重新上述操作
特殊元素定位之获取toast
- java-client版本必须满足5.0+
- desiredCapabilities中指定automationName为:UIAutomator2
- UIAutomator2只支持安卓版本5.0+
getElement(By.xpath("//*[contains(@text,'tips')]"));
Monkey使用
脚本优势:简单、快捷、不需要借助任何工具,可以做简单的性能测试
脚本缺点:只能简单实现坐标、按键等基本操作(根据像素点来进行操作)
1 | #头文件、控制monkey发送消息的参数 |
1 | # 上传monkey脚本 |
uiautomatorviewer使用
位置E:\android-sdk-windows\tools
1 | @echo on |
采坑记录:
小米手机有点坑啊,进行Android开发时需要设置挺多东西的。
- 关闭MIUI优化不然没法调试
- 如果进行uiautomatorviewer调试的话,必须还要把悬浮球给关了,不然没法获取界面。
TouchAction
-
点击操作
1
2
3
4
5
6
7
8
9
10
11
12// press
TouchAction ta=new TouchAction(driver);//创建一个TouchAction对象
ta.press(element).release().perform();//按一个元素
ta.press(500, 450).release().perform();//按一个坐标点
//按一个元素上的某个点,从左上角偏移100
ta.press(element,100,100).release().perform();
// tap
ta.tap(element).release().perform();//点一个元素
ta.tap(300, 500).release().perform();//点一个坐标点
//按一个元素的某个点,从左上角偏移100
ta.tap(element, 100, 100).release().perform(); -
长按操作
1
2
3
4
5
6
7
8
9
10// longPress
TouchAction ta=new TouchAction(driver);//创建一个TouchAction对象
ta.longPress(element).release().perform();//长按某个元素
ta.longPress(element, 5000).release().perform();//长按某个元素,时间是5秒
ta.longPress(300, 500).release().perform();//长按某个坐标点
ta.longPress(300, 500, 3000).release().perform();//长按某个坐标点,时间是5秒
//长按某元素上的某个点,从左上角偏移100
ta.longPress(element, 100, 100).release().perform();
//长按某元素上的某个点,从左上角偏移100,时间是3秒
ta.longPress(element, 100, 100, 3000).release().perform(); -
组合操作–拖拽
1
2
3
4
5// press + moveTo
TouchAction ta=new TouchAction(driver);//创建一个TouchAction对象
ta.press(element1).moveTo(element2).release().perform();//两个元素互换位置
//将元素拖拽到另外一个位置,moveTo中的是相对偏移量
ta.press(element1).waitAction(500).moveTo(0,200).waitAction(500).release().perform(); -
连续滑动手势(可用于手势解锁)
1 | // press + moveTo |
- 其他
1
2
3
4//在 0% 到 100% 内双指缩放屏幕
driver.pinch(element=el)
//放大屏幕 在 100% 以上放大屏幕
driver.zoom(element=el)
▲Appium java-client库更新到6.x后,滑动 swipe() 已弃用,且TouchAction类中很多方法也有改变。
- ( 总的来看,弃用的是 press() longPress() moveTo() tap() 参数使用 x、y轴和webElement 的这种类型,和用到Duration类型的方法 )
- 取而代之的是参数类型变了,涉及到XY轴定位的方法,参数使用了PointOption.point(X坐标, Y坐标);涉及到Duration的方法waitAction(),参数使用了WaitOptions.waitOptions(Duration.ofNanos(时间间隔))
1 | //java-client 4.x 滑动 swipe() 案例: |
众测的思路:
- 常见输入框的输入范围、限制
- 手机号11位、验证码6位、敏感信息、特殊字符
- toast提示框是否正确
- 控件是否有错别字
附录:
众包测试报告评分规则
1、众包测试得分=bug报告得分(包括单一状bug报告、fork的bug报告)
+评审得分(点赞,点踩)
2、每个Bug报告满分10分,Bug报告基础分1-5分,选手提交的Bug等级仅供参考,以评审人员判定为准;
3、Bug描述简洁清晰、复现步骤连贯、按序号排序,评审人员可根据其描述顺利的进行操作并复现Bug,附加3分。
4、Bug截图相关则附加1分,截图上使用红框标注Bug位置则附加1分;
5、点赞点踩得分规则:即为正确的bug报告点赞,错误的bug报告点踩可得分;反之扣分。
6、若两人提交bug报告相同,依据时间优先原则,后提交的报告计低分,所以若发现的bug已被他人提交,建议Fork(复制并补充修改)或对bug报告进行评审(点赞,点踩)。
开发者测试
语句覆盖: 保证程序中的每一个语句至少被执行一次。 被认为是“最弱的覆盖”
语句覆盖率:被执行语句的比例
判定覆盖(分支覆盖):CFG (control Flow Graph控制流图 )所有的边都被访问/所有的分支都被访问
▲针对判断语句,在设定案例的时候,要设定True和False的两种案例;与语句覆盖不同的是增加了False的情况
分支覆盖率:被访问的分支的比例
条件覆盖
针对判断语句里面案例的取值都要去一次,不考虑条件的取值。
每个小判断分别为真,其他为假的情况
判定/条件覆盖
判定覆盖各条件覆盖交叉,针对于判定中的条件取值 、
每个判定真假各一次(判定覆盖)
每个判定中的条件各取一次(条件覆盖)
组合覆盖
判定-条件覆盖的加强版
判定中所有可能的条件组合
路径覆盖
走完所有可能的路径
语句覆盖、条件覆盖(分支覆盖)、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖
输入域上的测试
–随机测试
–等价类划分
–边界值分析
- 最小值(min)
- 略大于最小值(min+)
- 输入值域内的任意值(nom)
- 略小于最大值(max-)
- 最大值(max)
Input Domain-Based Techniques(continue)
•Random Testing
•Combinatorial Testing
Author: Mrli
Link: https://nymrli.top/2019/10/18/软件测试笔记/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.