android自动化框架对比
目前较热门的开源框架有:android APIs提供的Instrumentation类、MonkeyRunner、Robotium、Appium、UIAutomator等
1.Instrumentation
优点:
- Android APIs提供
缺点:
- 跨进程受到android进程安全限制
2.Robotium
优点:
- 基于instrumentation实现,提供的接口可以满足大部分自动化需求,使用方法简单
- 支持手势、webview、截图等操作,支持Remote Control方式,支持ant、maven打包,与jenkins结合较好
缺点:
- 跨进程受到android进程安全限制,
- 待测App和测试App必须使用相同签名
3.Monkeyrunner
优点:
- Android SDK提供
缺点:
- python脚本,使用monkeyrunner test.py来执行、结果的验证是通过截屏比对图片来实现,验证方式不够灵活
4.UIAutomator
优点:
- Android提供的框架,支持SDK level 16及以上
- 支持跨进程测试!!!这一点比起Robotium来说非常赞
缺点:
- 打包成jar(如果是u2则是打包测试apk)后push到模拟器中运行,调试相对Robotium不便(其实自己稍微封装下也还OK)
- 不支持WebView、没有测试结果报告文件
位置:/system/framework/uiautomator.jar
5.Appium
优点:
- 使用WebDriver JSON wire protocol支持iOS和Android的UI测试、
- 支持非常多种语言编写测试脚本
缺点:
- Android SDK Level在16及以上时,底层使用的UIAutomator,低于16使用Selendroid
对比图:
Appium原理简述
Google为Android开发了自己的自动化测试框架 - UIAutomator,只支持Java语言。
Apple为iOS开发了自己的自动化测试框架,在Xcode里,叫做UIAutomation,只支持JavaScript语言。
如果你只做Android的自动化测试,那么UIAutomator也可以。
如果你只做iOS的自动化测试,那么UIAutomation也足够了。
如果你想既做Android的自动化测试,又做iOS的自动化测试,那么Appium就显得难能可贵了。
Appium的开发者认为,自动化测试,不应该限定特定的语言,也不应该限定特定的框架。
Appium几乎支持任何语言 - Java,Python,Ruby,PHP,C#,JavaScript等等。
使用Appium可以测试Android,也可以测试iOS,而且大部分代码都可以公用。
IOS 原理图
Android原理图
appium主线分析:
创建driver 并启动服务端:
创建一个session
处理一个request
java-client如何发送一套请求:
创建一个session
new AndroidDriver(url, capabilities);
public AppiumDriver(URL remoteAddress, Capabilities desiredCapabilities) {
this(new AppiumCommandExecutor(MobileCommand.commandRepository, remoteAddress),
desiredCapabilities);
}
RemoteWebDriver 中 startSession
protected void startSession(Capabilities desiredCapabilities,
Capabilities requiredCapabilities) {
....
Response response = execute(DriverCommand.NEW_SESSION, parameters);
....
sessionId = new SessionId(response.getSessionId());
}
与客户端建立连接
启动客户端
手机端的server
public class Bootstrap extends UiAutomatorTestCase {
public void testRunServer() {
Find.params = getParams();
boolean disableAndroidWatchers = Boolean.parseBoolean(getParams().getString("disableAndroidWatchers"));
boolean acceptSSLCerts = Boolean.parseBoolean(getParams().getString("acceptSslCerts"));
SocketServer server;
try {
server = new SocketServer(4724);
server.listenForever(disableAndroidWatchers, acceptSSLCerts);
} catch (final SocketServerException e) {
Logger.error(e.getError());
System.exit(1);
}
}
}
QQ图片20180129192831.jpg
网友评论