Cts框架解析(14)-任务执行过程
来源:互联网 发布:银川市大数据管理局 编辑:程序博客网 时间:2024/06/06 01:26
上一篇文章我们已经知道testcases目录中xml配置文件读取出来后的形式,继续往下看:
然后把xml对应的TestPackageDef保存到Map<String, TestPackageDef>中,所以我们可以这样说,TestPackageDef就代表了一个testcases目录下的xml文件。所以有多少个xml文件就有多少个TestPackageDef对象,然后将这些对象保存到map中。key值为xml的appPackageName属性值。当所有的xml文件都配置完成后,我们就回到了buildTestsToRun方法中:
这个时候调用了getTestPackagesToRun,这个方法是从刚才得到的testRepo对象中筛选出本次任务需要跑的ITestPackageDef列表。再根据该列表组装List<TestPackage>
对象testPkgList并返回。
然乎根据参数来添加发生错误时的操作:
保存bugreport信息
保存截图
保存logcat system的信息
然后找到要安装的apk和执行完任务后要卸载的包名:
这是根据xml中targetBinaryName属性对应的值找到apk名和targetNameSpace属性找到要卸载的包名。然后安装这些apk,并获取手机设备信息。实际上是通过安装TestDeviceSetup.apk,然后运行Instrumentation的case来获取信息的。获取完信息以后,会判断是否需要重启,只有当要执行的case包大于1且mDisableReboot为false时才重启设备。然后是循环执行测试任务,以包为单位执行,执行的核心为test.run(filter);
先将包含测试的apk安装到设备中,然后运行case,最后删除case包。我们来看看删除的case包到底是什么。
原来apk安装后,android系统是通过其包名来定位apk的,所以卸载的时候肯定要用包名。先来再来回头看super.run(listener);
先通过DDM的RemoteAndroidTestRunner来创建测试的runner,然后设置一些基本参数,就可以调用doTestRun方法来进行实际的测试。
先获得要测试的case信息。经过一系列跳来跳去跳来跳去,最后到了TestDevice中:
最后到执行case,执行完以后会判断是否成功发送了命令,如果没有就要重连设备。最后讲一下performDeviceAction这个方法:
private boolean performDeviceAction(String actionDescription, final DeviceAction action, int retryAttempts) throws DeviceNotAvailableException {// 如果成功直接返回,如果失败就要重试for (int i = 0; i < retryAttempts + 1; i++) {try {return action.run();} catch (TimeoutException e) {logDeviceActionException(actionDescription, e);} catch (IOException e) {logDeviceActionException(actionDescription, e);} catch (InstallException e) {logDeviceActionException(actionDescription, e);} catch (SyncException e) {logDeviceActionException(actionDescription, e);// a SyncException is not necessarily a device communication// problem// do additional diagnosisif (!e.getErrorCode().equals(SyncError.BUFFER_OVERRUN) && !e.getErrorCode().equals(SyncError.TRANSFER_PROTOCOL_ERROR)) {// this is a logic problem, doesn't need recovery or to be// retriedreturn false;}} catch (AdbCommandRejectedException e) {logDeviceActionException(actionDescription, e);} catch (ShellCommandUnresponsiveException e) {CLog.w("Device %s stopped responding when attempting %s", getSerialNumber(), actionDescription);}// TODO: currently treat all exceptions the same. In future consider// different recovery// mechanisms for time out's vs IOExceptionsrecoverDevice();}if (retryAttempts > 0) {throw new DeviceUnresponsiveException(String.format("Attempted %s multiple times " + "on device %s without communication success. Aborting.",actionDescription, getSerialNumber()));}return false;
上面的写法会在case执行过程中出现异常的话,会有重试机制。但前提是retryAttempts这个变量的值要大于0。
- Cts框架解析(14)-任务执行过程
- Cts框架解析(13)-任务执行过程
- Cts框架解析-任务执行过程
- Cts框架解析(6)-任务的执行
- Cts框架解析(15)-任务执行完
- Cts框架解析(7)-任务执行的调度室
- Cts框架解析(4)-任务的添加
- cts任务执行
- CTS测试框架 -- 命令执行
- Cts框架解析(8)-IBuildProvider
- Cts框架解析(9)-IDeviceRecovery
- Cts框架解析(10)-TestDeviceOptions
- Cts框架解析(11)-ICommandOptions
- Cts框架解析(12)-ITargetPreparer
- CTS测试框架 -- 命令解析
- Cts框架解析(1)-windows下cts配置
- Cts框架解析(2)-cts调试环境的搭建
- Cts框架解析-cts调试环境的搭建
- hdu 5013 优化疑问+dp
- 杭电acm1002A + B Problem II
- Java高手真经_编程基础卷——读书笔记(3)——Eclipse新建工程及基本设置
- Sublime Text快键使用手册
- HDU 5071 Chat
- Cts框架解析(14)-任务执行过程
- Linux用户和组的管理
- PHP使用GD库生成图像验证码
- 雍正皇帝——《雍正传》
- @GeneratedValue
- SDK升级后,AAPT报错:CreateProcess error=2
- mysql出现错误“ Every derived table must have its own alias”
- flex中只打开一个窗口(用单例实现)
- [笔记] Codeforces#274 Riding in a Lift (479E) DP