需要进行自动化测试软件,体验了一下常见的自动化测试方案。
了解之后选出适合项目使用的方案。
记录下测试时的所得,方便自己,方便别人。
Monkey
介绍:
Monkey 是 Android 的一个命令行工具,所以只需 sdk\platform-tools\adb.exe
工具,无需其他工具。【方便】【快速】的向设备系统【随机】发送伪用户事件流。测试内容【不可控】,适合对软件界面UI进行压力测试。
直接测试:
adb shell monkey -p <your.package.name> -vvv 500 > monkeytest.txt
带日志测试:
- 进入目标设备 Linux Shell 环境:
adb shell
或 (adb -s 设备序列号 shell
) - 使用工具开启测试:
monkey -p your.package.name -v 500
命令解释:
-p
:表示对象包-v
: 为 verbose的缩写,3个v就是输出等级1至3的所有事件.> monkeytest.txt
:使用管道命令将输出结果放到一个文本里面方便查看- 启动指定的应用程序,并向其发送500个伪随机事件
MonkeyRunner
介绍:
MonkeyRunner 是一个包含 API 的工具包,通过 sdk\tools\monkeyrunner.bat 进行调试。但【API接口较少】,支持【python】脚本进行【二次开发】拓展测试功能。【可录制】操作脚本,但是【依赖屏幕坐标】,执行【很慢】,操作之间需要加入等待时间。【可截图】保存测试结果
功能:
- 多设备控制:可以同一时间,连接多个、启动多个、运行多个设备或模拟器。模拟器也可以自动启动和关闭(需提前配置模拟器)。
- 功能测试:自动贯彻一次某个应用的功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
- 回归测试:将某个应用的运行结果截屏,与既定已知正确的结果截屏比较,以此测试应用的稳定性。
- 可扩展的自动化:monkeyrunner只是个工具包,可以借助python脚本定制专属测试系统。
注意:
如有中文,必须保存为UTF-8格式,否则出现ASCNII无法支持错误
使用:
- cmd进入sdk\tools目录下输入:monkeyrunner your.py【运行指定的py脚本】
- 也可以使用录制py脚本导出mr文件,在使用执行py脚本执行录制时的操作。动作之间需要加延迟
录制py脚本代码
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
device = mr.waitForConnection()
recorder.start(device)
播放py脚本
import sys
from com.android.monkeyrunner import MonkeyRunner
CMD_MAP = {
'TOUCH': lambda dev, arg: dev.touch(**arg),
'DRAG': lambda dev, arg: dev.drag(**arg),
'PRESS': lambda dev, arg: dev.press(**arg),
'TYPE': lambda dev, arg: dev.type(**arg),
'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
}
def process_file(fp, device):
for line in fp:
(cmd, rest) = line.split('|')
try:
# Parse the pydict
rest = eval(rest)
except:
print 'unable to parse options'
continue
if cmd not in CMD_MAP:
print 'unknown command: ' + cmd
continue
CMD_MAP[cmd](device, rest)
def main():
file = sys.argv[1]
fp = open(file, 'r')
device = MonkeyRunner.waitForConnection()
process_file(fp, device)
fp.close();
if __name__ == '__main__':
main()
录制的mr文件内容
TOUCH|{'x':685,'y':560,'type':'downAndUp',}
WAIT|{'seconds':1.0,}
DRAG|{'start':(432,1536),'end':(432,307),'duration':1.0,'steps':500,}
PRESS|{'name':'MENU','type':'downAndUp',}
PRESS|{'name':'HOME','type':'down',}
PRESS|{'name':'SEARCH','type':'up',}
TYPE|{'message':'input text',}
共享的常用脚本:
UIAutomator
介绍:
Google 退出亲儿子,通过 sdk/platforms/android-XXX\uiautomator.jar。【API接口多】,可对 【android 所有事件】 【不依赖坐标】进行操作。可分析UI界面【控件ID、Text、focusable等等属性】,可对【UI层级】进行分析。基于【Java】,最后通过【ANT】工具将测试脚本编译成【Jar包脚本】可通过 【adb运行】在所有 Android 设备。但是【Android 版本需要21以上】,即 android-XXX >= 21
使用:
导入jar: sdk\platforms\android-21\uiautomator.jar
版本不能低于21
导入library:Junit4
新建类继承 UiAutomatorTestCase 类,并进行测试操作
public class MatorTest extends UiAutomatorTestCase{
public void test() throws RemoteException {
UiDevice device = getUiDevice();
// 亮屏
device.wakeUp();
sleep(1000);
// 按压Home
device.pressHome();
sleep(1000);
}
}
编译生成脚本(sdk\tools目录下):
android create uitest-project -n <name> -t <target-android-sdk-ID> -p <project_path>
- `name`:将要生成 jar 包的名字
- `project_path`:项目工程的路径
- `target-android-sdk-id`:和导入 uiautomator.jar 所在的android版本一致的ID。用 android list 查看具体ID
成功提示:Added file 工程目录\build.xml
ANT编译脚本生成jar包(工程目录下):
ant build
会在 工程目录\bin\ 生成 jar 包。就是 uiautomator 脚本
将 jar 包 push 到手机的 data/local/tmp 目录下
adb push <jar文件路径> data/local/tmp
启动我们 push 进入的 uiautomator 脚本
adb shell uiautomator runtest <jar文件名> -c <工程中的类名(包含包名)>
GT
介绍:
腾讯MIG内部使用”移动应用脱机白盒调试组件“,只需【手机】装软软件,即可【随时随地】调试手机上安装的软件。支持分析调试软件的【内存占用】【CPU占用】【流量耗用】【电池温度】【流畅的】等功能。
可【保存调试日志】在文本文档中,方便查看。
使用:
手机下载安装GT软件
Rubotium
介绍:
Robotium 是为了弥补 Android 单元测试框架 Instrumentation 中的 ActivityinstrumentationTestCase2 类测试功能支持不足而出现的。【针对APK】提供了更多的【控件操作函数】,通过反射手段【调用系统隐藏功能】等。运行时【绑定GUI组件】,【不依赖屏幕坐标】,能【更简单、快速】实现测试功能。新建【Android Test Project】工程,工程测试脚本编译成【没有主界面的APK程序】,可通过 Android Shell 环境进行启动,需要安装两个【APK程序】,也整合【Maven】【ANT】运行测试。
使用:
- 新建测试工程:File - New Project - Android Test Project
- 导入Jar包依赖:robotium-solo-5.1.jar
- 创建 JUnit Test Case 类继承 ActivityInstrumentationTestCase2。注意是 Junit4。
- 利用 Solo 等对象进行调试代码实现
public class MyTest1 extends ActivityInstrumentationTestCase2 {
private Solo solo;
public MyTest1() {
super(MainActivity.class);
}
@Before
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
@After
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
@Test
public void test() {
solo.clickOnButton("button1");
solo.sleep(1000);
solo.clickOnButton("button2");
solo.sleep(1000);
solo.clickOnButton("button3");
solo.sleep(1000);
solo.clickOnButton("跳转");
solo.sleep(1000);
solo.goBack();
solo.sleep(1000);
}
}
- 右键测试工程:Run As Android JUnit Test
- 也可以通过android am 工具启动(前提是软件和测试软件都安装了)
- adb shell 进入手机shell环境
- pm list instrumentation (查看当前手机安装了哪些 instrumentation)
- am instrument -w 程序报名/android.test.InstrumentationTestRunner(运行测试程序,注意此类没有主界面)