Android标准App的四大自动化测试

本文介绍了Android自动化测试中的关键工具Monkey,用于进行稳定性测试。Monkey是Google为开发者提供的一个工具,能够模拟用户随机操作,以测试应用的健壮性。文中提到,Monkey不仅可以进行随机事件的发送,还可以辅助进行简单的自动化测试。通过运行特定命令,可以发送一定数量的随机事件来检查应用的稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WeTest导读

说起Android的自动化测试,相信有很多小伙伴都接触过或者有所耳闻,本文从框架最基本的功能介绍及API的使用入手,结合简单的项目实战来帮忙大家对该框架进一步理解和加深印象。下面让我们来一睹标准App的四大自动化测试法宝的风采!

法宝1:稳定性测试利器——Monkey

要想发布一个新版本,得先通过稳定性测试。理想情况是找个上幼儿园的弟弟妹妹,打开应用把手机交给他,让他胡乱的玩,看你的程序能不能接受这样的折腾。但是我们身边不可能都有正太和萝莉,也不能保证他们拿到手机后不是测试软件的健壮性,反而测试你的手机经不经摔,这与我们的期望差太远了…
Google公司考虑到我们的需要,开发出了Monkey这个工具。但在很多人的印象中,Monkey测试就是让设备随机的乱点,事件都是随机产生的,不带任何人的主观性。很少有人知道,其实Monkey也可以用来做简单的自动化测试工作。
Mokey基本功能介绍
首先,介绍下Monkey的基本使用,如果要发送500个随机事件,只需运行如下命令:
adb shell monkey 500

插上手机运行后,大家是不是发现手机开始疯狂的运行起来了。So Easy!
在感受完Monkey的效果后,发现这“悟空”太调皮了,根本招架不住啊!是否有类似“紧箍咒”这种约束类命令,让这只猴子在某个包或类中运行呢?要想Monkey牢牢的限制在某个包中,命令也很简单:
adb shell monkey –p your-package-name 500

-p后面接你程序的包名。多想限制在多个包中,可以在命令行中添加多个包:
adb shell monkey –p your-package1-name –p your-package2-name 500

这样“悟空”就飞不出你的五指山了。
Mokey编写自动化测试脚本
若控制不住“悟空”,只让它随机乱点的话,Monkey是替代不了黑盒测试用例的。我们能不能想些办法,控制住“悟空”让他做些简单的自动化测试的工作呢?下面来看一下,如何用Monkey来编写脚本。
先简单介绍下Monkey的API,若有需要详细了解的小伙伴,可自行百度或谷歌一下查阅哈。
(1) 轨迹球事件:DispatchTrackball(参数1~参数12)
(2) 输入字符串事件:DispatchString(String text)
(3) 点击事件:DispatchPointer(参数1~参数12)
(4) 启动应用:LaunchActivity(String pkg_name, String class_name)
(5) 等待事件:UserWait(long sleeptime)
(6) 按下键值:DispatchPress(int keyCode)
(7) 长按键值:LongPress(int keyCode)
(8) 发送键值:DispatchKey(参数1~参数8)
(9) 打开软键盘:DispatchFlip(Boolean keyboardOpen)
了解完常用API后,我们来看一下Monkey脚本的编写规范。Monkey Script是按照一定的语法规则编写的有序的用户事件流,使用于Monkey命令工具的脚本。Monkey脚本一般以如下4条语句开头:

?

1

2

3

4

5

<code><code><code>#
Start Script

type
= user    #指明脚本类型

count
10    
#脚本执行次数

speed
1.0   
#命令执行速率

start
data >>  #用户脚本入口,下面是用户自己编写的脚本</code></code></code>

下面来看一个简单应用的实战,实现的效果很简单,就是随便输入文本,选择选项再进行提交,提交后要验证提交后的效果。
 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code><code><code>#
Start

Script

type
= user

count
10

speed
1.0

start
data >>LaunchActivity(com.ringo.bugben,com.ringo.bugben.MainActivity)

#
点击文本框
1

captureDispatchPointer( 10 , 10 , 0 , 210 , 200 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

captureDispatchPointer( 10 , 10 , 1 , 210 , 200 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

#
确定文本框
1 内容

captureDispatchString(Hello)

#
点击文本框
2

captureDispatchPointer( 10 , 10 , 0 , 210 , 280 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

captureDispatchPointer( 10 , 10 , 1 , 210 , 280 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

#
确定文本框
2 内容

captureDispatchString(Ringo)

#
点击加粗

captureDispatchPointer( 10 , 10 , 0 , 210 , 420 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

captureDispatchPointer( 10 , 10 , 1 , 210 , 420 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

#
点击大号

captureDispatchPointer( 10 , 10 , 0 , 338 , 476 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

captureDispatchPointer( 10 , 10 , 1 , 338 , 476 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

#
等待
500 毫秒

UserWait( 500 )

#
点击提交

captureDispatchPointer( 10 , 10 , 0 , 100 , 540 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )

captureDispatchPointer( 10 , 10 , 1 , 100 , 540 , 1 , 1 ,- 1 , 1 , 1 , 0 , 0 )</code></code></code>

将上述代码另存为HelloMonkey文件,然后将该脚本推送到手机的sd卡里。

?

1

<code><code><code>adb
push HelloMonkey /mnt/sdcard/</code></code></code>

然后运行:

?

1

<code><code><code>adb
shell monkey -v -f /mnt/sdcard/HelloMonkey 
1 </code></code></code>

脚本后面的数字1表示运行该脚本的次数。小伙伴们可以安装附件里的Bugben.apk再执行下脚本感受下哦!

Monkey工具总结

Monkey可以编写脚本做简单的自动化测试,但局限性非常大,例如无法进行截屏操作,不能简单的支持插件的编写,没有好的办法控制事件流,不支持录制回放等。我们在平时的使用中,关注较多的是利用好Monkey的优势,如不需源码,不需编译就可以直接运行。

法宝2:Monkey之子——MonkeyRunner

Monkey虽然能实现部分的自动化测试任务,但本身有很多的局限性,例如不支持截屏,点击事件是基于坐标的,不支持录制回放等。我们在实际应用中,尽量关注利用好Monkey测试的优势。若平时的工作中遇到Monkey工具无法满足的,这里给大家推荐另一款工具MonkeyRunner。
同样先简单的介绍下MonkeyRunner的API,这里重点介绍能够实现上文Monkey脚本的API,其余的API感兴趣的小伙伴可以自行查阅。
(1) 等待设备连接:waitForConnection()
(2) 安装apk应用:installPackage(String path)
(3) 启动应用:startActivity(String packageName+activityName)
(4) 点击事件:touch(int xPos, int yPos, dictionary type)
(5) 输入事件:type(String text)
(6) 等待:sleep(int second)
(7) 截图:takeSnapshot()
(8) 发送键值:press(String name, dictionary type)

MokeyRunner编写自动化测试脚本

下面我们来看下,用MonkeyRunner实现的自动化脚本。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

<code><code><code>

#
import
monkeyrunner modules

from
com.android.monkeyrunner 
import
MonkeyRunner, MonkeyDevice, MonkeyImage

#
Parameters

txt1_x
210

txt1_y
200

txt2_x
210

txt2_y
280

txt3_x
210

txt3_y
420

txt4_x
338

txt4_y
476

submit_x
100

submit_y
540

type
'DOWN_AND_UP'

seconds
1

txt1_msg
'Hello'

txt2_msg
'MonkeyRunner'

#
package
name and activity name

package
'com.ringo.bugben'

activity
'.MainActivity'

component
package
'/' +activity

#
Connect device

device
= MonkeyRunner.waitForConnection() 

#
Install bugben

device.installPackage( './bugben.apk' )

print
'Install bugben.apk...'

#
Launch bugbendevice.startActivity(component)

print
'Launching bugben...'

#
Wait 1s

MonkeyRunner.sleep(seconds)

#
Input txt1

device.touch(txt1_x,
txt1_y, type)device.type(txt1_msg)

print
'Inputing txt1...'

#
Input txt2

device.touch(txt2_x,
txt2_y, type)

device.type(txt2_msg)

print
'Inputing txt2...'

#select
bold and size

device.touch(txt3_x,
txt3_y, type)

device.touch(txt4_x,
txt4_y, type) 

#
Wait 1s

MonkeyRunner.sleep(seconds)

#
Submitdevice.touch(submit_x, submit_y, type)

print
'Submiting...'

#
Wait 1s

MonkeyRunner.sleep(seconds)

#
Get the snapshot

picture
= device.takeSnapshot()

picture.writeToFile( './HelloMonkeyRunner.png' , 'png' )

print
'Complete! See bugben_pic.png in currrent folder!'

#
Back to home

device.press( 'KEYCODE_HOME' , type)

print
'back to home.' </code></code></code>

将脚本保存为HelloMonkeyRunner.py,并和Bugben.apk一起拷贝到Android SDK的tools目录下,执行monkeyrunner HelloMonkeyRunner.py

执行完成后,效果如上,并且会在当前目录生成HelloMonkeyRunner.png截图。
MokeyRunner的录制回放
首先是环境配置,在源码“~\sdk\monkeyrunner\scripts”目录下有monkey_recZ喎�"/kf/ware/vc/" target="_blank" class="keylink">vcmRlci5webrNbW9ua2V5X3BsYXliYWNrLnB5o6y9q9Xiwb249s7EvP4ouL28/tbQ09DV4sG9zsS8/im/vbG0tb1TREu1xHRvb2xzxL/CvM/Co6y+zb/J0tTNqLn9yOfPwrT6wuu9+NDQxvS2r6O6PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPHByZSBjbGFzcz0="brush:java;">monkeyrunner
monkey_recorder.py

运行结果如下图所示:
 


下面用MonkeyRecorder提供的控件,来进行脚本的录制。

录制完成后,导出脚本保存为HelloMonkeyRunnerRecorder.mr,用文本编辑器打开代码如下:

?

1

2

3

4

5

6

<code><code><code>TOUCH|{ 'x' : 317 , 'y' : 242 , 'type' : 'downAndUp' ,}

TYPE|{ 'message' : 'Hello' ,}TOUCH|{ 'x' : 283 , 'y' : 304 , 'type' : 'downAndUp' ,}

TYPE|{ 'message' : 'MonkeyRecorder' ,}

TOUCH|{ 'x' : 249 , 'y' : 488 , 'type' : 'downAndUp' ,}

TOUCH|{ 'x' : 375 , 'y' : 544 , 'type' : 'downAndUp' ,}

TOUCH|{ 'x' : 364 , 'y' : 626 , 'type' : 'downAndUp' ,}</code></code></code>

脚本录制完毕,接来下看看回放脚本是否正常。回放脚本时执行以下命令:
monkeyrunner monkey_playback your_script.mr

由于脚本中未加入拉起应用的代码,这里运行前需手动拉起应用。
 



结果运行正常,符合我们的预期。

MonkeyRunner工具总结

MonkeyRunner有很多强大并好用的API,并且支持录制回放和截图操作。同样它也不需源码,不需编译就可以直接运行。但MonkeyRunner和Monkey类似,也是基于控件坐标进行定位的,这样的定位方式极易导致回放失败。

法宝3:单元测试框架——Instrumentation

Monkey父子均可通过编写相应的脚本,在不依赖源码的前提下完成部分自动化测试的工作。但它们都是依靠控件坐标进行定位的,在实际项目中,控件坐标往往是最不稳定的,随时都有可能因为程序员对控件位置的调整而导致脚本运行失败。怎样可以不依赖坐标来进行应用的自动化测试呢?下面就要亮出自动化测试的屠龙宝刀了——Instrumentation框架。
Instrumentation框架主要是依靠控件的ID来进行定位的,拥有成熟的用例管理系统,是Android主推的白盒测试框架。若想对项目进行深入的、系统的单元测试,基本上都离不开Instrumentation这把屠龙宝刀。
在了解Instrumentation框架之前,先对Android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是原来的你吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值