Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

软件测试笔记

2019/11/02 Java 软件测试
Word count: 3,310 | Reading time: 14min

软件测试笔记

移动应用测试

appnium使用

安装的是appnium-desktop,没有教程中所说的Appium/node_modules/.bin/路径,使用命令行输入appniumappium-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
2
3
4
5
6
7
8
9
10
11
//设置自动化相关参数
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "");
// 确定自己的手机系统是Android、ios的话需要需改
capabilities.setCapability("platformName", "Android");
// 这边要设置成自己的设备uuid,通过adb devices查看
capabilities.setCapability("deviceName", "Android Emulator");
// 这个demo代码会提供好,就不需要自己去找了
capabilities.setCapability("appPackage", "cn.etouch.ecalendar");
capabilities.setCapability("appActivity", ".ECalendar");
capabilities.setCapability("noSign", "true");

appPackage查看包名(可以找到唯一的应用):adb shell dumpsys activity | find "mFocusedActivity",需要的结果即cn.etouch.ecalendar

1
2
adb shell dumpsys activity | find  "mFocusedActivity"
>>> mFocusedActivity: ActivityRecord{1510a73 u0 cn.etouch.ecalendar/.MainActivity t2}

activityName查询类名(找到应用上的某个界面):aapt dump badging <apkPath>然后找到launchable-activity

1
2
3
# e.g.
E:\android-sdk-windows\build-tools\28.0.3\aapt dump badging C:\mooctest\projects\3399\52660\Zhwnl\apk\Zhwnl.apk | grep launchable-activity
>>> launchable-activity: name='cn.etouch.ecalendar.ECalendar' label='中华万年历' icon=''

步骤二:

除了代码上设置好连接手机的参数,手机也需要设置电脑能操作手机

需要打开三个选项:“USB调试”、“USB安装”、“USB调试(安全设置)”

以小米6手机为例:“更多设置”->“开发者选项”->“USB调试”、“USB安装”、“USB调试(安全设置)”

由于之前使用python玩过ADB,所以**“USB调试”、"USB调试(安全设置)"是开启的,而没打开USB安装**,所以导致了一直失败。实际上打开USB安装后,会安装几个程序比如Unlock、appnium settings等。其实报错一开始也提示了,没检测到手机,啥啥安装不上,只不过当时没留意

1
2
3
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)
Command duration or timeout: 469 milliseconds
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'

▲后来又发现,不设置platformVersiondeviceName直接设置成Android Emulator也行,看来最主要的原因还是手机第一次使用Appnium之前需要安装写appnium的软件

unicode

这个应该就是这两行所安装的东西

1
2
3
4
//设置使用unicode键盘,支持输入中文和特殊字符
capabilities.setCapability("unicodeKeyboard","true");
//设置用例执行完成后重置键盘
capabilities.setCapability("resetKeyboard","true");

夜深模拟器测试

1 开启USB调试

设置->关于平板电脑->多次点击"版本号"进入开发者模式->开发者选项->打开**“USB调试”"允许模拟位置"**

2 查看deviceName

命令行中输入adb devices,如果一直没检测到,解决方案如下(我是需要这么做的):

1
2
3
4
5
6
7
8
9
10
11
12
13
如果在设备连接过程中,确定设备已经开启USB调试且正确连接到PC,但是仍旧使用adb devices指令查到设备列表为空,则有可能是已安装的安卓SDK中的adb程序版本和模拟器自带的adb程序版本不一致导致的。

解决办法可能有很多种,这里暂介绍楼主亲测实用的方案:

第一步:关闭正在运行的的模拟器

第二步:替换adb.exe程序。

逍遥模拟器:进入安装目录(默认为..\Microvirt\MEmu),找到adb.exe文件,执行删除。然后进入SDK的安装目录(默认为..\android-sdk-windows\platform-tools),拷贝系统adb.exe到逍遥的原目录即可。

夜神模拟器:进入安装目录,找到nox_adb.exe文件,执行删除。然后进入SDK的安装目录(默认为..\android-sdk-windows\platform-tools),拷贝系统adb.exe到逍遥的原目录,重命名为“nox_adb.exe”即可。

第三步:启动模拟器。启动完毕后,打开cmd命令窗口输入 adb devices 再次检查设备连接情况,一般就能正常看到已连接的虚拟设备信息了。

运行代码main.java

1
2
3
4
5
6
7
8
9
//设置自动化相关参数
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("browserName", "");
capabilities.setCapability("platformName", "Android");
// capabilities.setCapability("platformVersion", "8.0.0");
capabilities.setCapability("deviceName", "127.0.0.1:62001");
capabilities.setCapability("appPackage", "cn.etouch.ecalendar");
capabilities.setCapability("appActivity", ".ECalendar");
capabilities.setCapability("noSign", "true");

然后运行测试代码就能看到这样的画面了

夜神模拟器

进入元素审查

元素审查

安装教程,我是安装软件测试大赛提供的教程安装下来的,只不过感觉这篇可能将的更好一点。( appium-doctor 是需要额外用npm安装的,而不是像比赛教程中写的那样)

踩坑记录:

出现报错UiAutomator exited unexpectedly with code 0, signal null

1
2
3
4
5
6
$ adb shell
$ cd /data/local/tmp (如果一次性进不去,可以分层一层层进入)
# 3、进入data/local/tmp 后ls查看全部目录,应该有一个 AppiumBootstrap.jar,可能你的名字是 AppiumBoots 或者 AppiumBootstrap.jar。
# 4、将andriod sdk下的AppiumBootstrap.jar发送上去
$ adb push C:\Users\10630\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-android-driver\bootstrap\bin\AppiumBootstrap.jar /data/local/tmp
# 5、ok,大功告成
adb unauthorized

1.使用adb连接手机时,即使打开了usb调试,手机添加了信任,仍然出现unauthorized的提示

2.C:\Users\(Username)\.android里面删掉adbkey和adbkey.pub两个文件(没添加过信任的话是没有的),然后重新插拔手机

执行:

1
2
adb kill-server
adb start-server

△如果上述方式还是无效的话,选择“开发者测试”->"调试"中的撤销USB调试授权,然后重新上述操作

特殊元素定位之获取toast

  • java-client版本必须满足5.0+
  • desiredCapabilities中指定automationName为:UIAutomator2
  • UIAutomator2只支持安卓版本5.0+
  • getElement(By.xpath("//*[contains(@text,'tips')]"));

Monkey使用

脚本优势:简单、快捷、不需要借助任何工具,可以做简单的性能测试
脚本缺点:只能简单实现坐标、按键等基本操作(根据像素点来进行操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#头文件、控制monkey发送消息的参数
type=raw events
count=10
speed=1.0
#以下monkey命令
start data>>
# 开启柠檬杯app
LaunchActivity(com.lemon.lemonban,com.lemon.lemonban.activity.WelcomeActivity)
#让脚本暂停运行4S UserWait(4000)
#点击我的柠檬元素
Tap(600,1220)
#点击我的头像登录
#让脚本暂停运行1S UserWait(1000)
Tap(300,200)
#让脚本暂停运行1s UserWait(2000)
#输入手机号码
DispatchString(18588220110)
#点击密码输入框
Tap(200,650)
#输入密码
DispatchString(123456)
#点击登录按钮
Tap(320,800)
UserWait(3000)
1
2
3
4
# 上传monkey脚本
adb push monkeyScript.txt /sdcard/
# 运行monkey脚本
adb shell monkey -f /sdcard/monkeyScript.txt

uiautomatorviewer使用

位置E:\android-sdk-windows\tools

1
2
3
4
5
6
7
@echo on

adb shell uiautomator dump /sdcard/app.uix
adb pull /sdcard/app.uix .

adb shell screencap -p /sdcard/app.png
adb pull /sdcard/app.png .

采坑记录:

小米手机有点坑啊,进行Android开发时需要设置挺多东西的。

  1. 关闭MIUI优化不然没法调试
  2. 如果进行uiautomatorviewer调试的话,必须还要把悬浮球给关了,不然没法获取界面。

TouchAction

  1. 点击操作

    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();
  2. 长按操作

    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();
  3. 组合操作–拖拽

    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();
  4. 连续滑动手势(可用于手势解锁)

1
2
3
4
5
6
7
8
// press + moveTo
TouchAction ta=new TouchAction(driver);//创建一个TouchAction对象
//从第一个点一直滑动到第四个点
ta.press(200, 200).moveTo(0, 100).moveTo(100, 0).moveTo(100, 100).release().perform();
//从第一个元素一直滑动到第四元素
ta.press(element1).moveTo(element2).moveTo(element3).moveTo(element4).release().perform()
// swipe
driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);
  1. 其他
    1
    2
    3
    4
    //在 0% 到 100% 内双指缩放屏幕 
    driver.pinch(element=el)
    //放大屏幕 在 100% 以上放大屏幕
    driver.zoom(element=el)

appnium定位+操作方式(python)——老版本

▲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
2
3
4
5
6
//java-client 4.x 滑动 swipe() 案例:
driver.swipe(width * 3 / 4, height / 2, width / 4, height / 2, during);

//java-client 6.x 滑动案例:
int nanos=(int) (second*1000);
TouchAction action = new TouchAction(driver).press(PointOption.point(width* 3/4,height/2)).waitAction(WaitOptions.waitOptions(Duration.ofNanos(nanos))).moveTo(PointOption.point(width/4, height/2)).release().perform();

java-client 5.0.4后被移除的函数

众测的思路:

  • 常见输入框的输入范围、限制
    • 手机号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.

< PreviousPost
PAT冲冲冲——甲级
NextPost >
玩玩Stm32
CATALOG
  1. 1. 软件测试笔记
    1. 1.1. 移动应用测试
      1. 1.1.1. appnium使用
        1. 1.1.1.1. 真机测试
        2. 1.1.1.2. 夜深模拟器测试
          1. 1.1.1.2.1. 进入元素审查
          2. 1.1.1.2.2. 踩坑记录:
            1. 1.1.1.2.2.1. adb unauthorized
      2. 1.1.2. 特殊元素定位之获取toast
      3. 1.1.3. Monkey使用
      4. 1.1.4. uiautomatorviewer使用
      5. 1.1.5. 众测的思路:
      6. 1.1.6. 附录:
        1. 1.1.6.1. 众包测试报告评分规则
    2. 1.2. 开发者测试
    3. 1.3. 输入域上的测试
    4. 1.4. Input Domain-Based Techniques(continue)