写点什么

Android R 给自家 UA 工具挖坑

  • 2022 年 9 月 26 日
    北京
  • 本文字数:1873 字

    阅读完需:约 6 分钟

最近 Android 发布了 AndroidStudio 3.6 稳定版,升级后明显能体验到好多细节的提升,最大的提升莫过于可以创建 Android R 预览版的模拟器了,并且模拟器可以设置多个尺寸的屏幕。Android R 的 xm6 模拟器可以直接运行 arm 架构的程序,以后开发过程中再也不用为测试机担忧了。但是在执行 uiautomator1 脚本时就存在了不兼容问题。

异常情况

但是在使用 Android R 模拟器进行开发工作中发现执行 UiAutomator1.0 脚本出现如下异常:

Warning: This version of UI Automator is deprecated. New tests should be written usingUI Automator 2.0 which is available as part of the Android Testing Support Library.See https://developer.android.com/training/testing/ui-testing/uiautomator-testing.htmlfor more details.INSTRUMENTATION_STATUS: stream=Test results for WatcherResultPrinter=Test run aborted due to unexpected exception: Failed resolution of: Landroid/test/RepetitiveTest;java.lang.NoClassDefFoundError: Failed resolution of: Landroid/test/RepetitiveTest;        at com.android.uiautomator.testrunner.UiAutomatorTestRunner$WatcherResultPrinter.startTest(UiAutomatorTestRunner.java:297)        at junit.framework.TestResult.startTest(TestResult.java:168)        at junit.framework.TestResult.run(TestResult.java:119)        at junit.framework.TestCase.run(TestCase.java:129)        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAutomatorTestRunner.java:160)        at com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutomatorTestRunner.java:96)        at com.android.commands.uiautomator.RunTestCommand.run(RunTestCommand.java:91)        at com.android.commands.uiautomator.Launcher.main(Launcher.java:83)        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:396)Caused by: java.lang.ClassNotFoundException: android.test.RepetitiveTest        ... 10 more
Time: 0.039
OK (1 test)

INSTRUMENTATION_STATUS: shortMsg=Failed resolution of: Landroid/test/RepetitiveTest;INSTRUMENTATION_STATUS_CODE: -1

复制代码

异常触发流程

通过分析发现是因为找不到 Landroid/test/RepetitiveTest 类文件。那么分析一下堆栈信息看异常具体出现在哪里?

在执行 UiAutomator1.0 测试用例时,是在 UiAutomatorTestRunner 类中初始化测试资源并执行测试用例的。所以对异常堆栈信息的分析从 UiAutomatorTestRunner 类开始。

com.android.uiautomator.testrunner.UiAutomatorTestRunner.run(UiAutomatorTestRunner.java:96)

源码如图,可以看到此处不存在异常行为,需要定位下一个堆栈信息



com.android.uiautomator.testrunner.UiAutomatorTestRunner.start(UiAutomatorTestRunner.java:160)

通过分析源码会发现是遍历执行测试用例时产生的异常,并且此处是



**junit.framework.TestResult.startTest **仅仅调用了 WatcherResultPrinter#startTest 方法,所以需要继续定位异常原因



com.android.uiautomator.testrunner.UiAutomatorTestRunner$WatcherResultPrinter.startTest(UiAutomatorTestRunner.java:297)

是真正触发异常的位置,可以看到第一次引用 android.test.RepetitiveTest 接口文件时产生了 java.lang.NoClassDefFoundError: 异常信息。



1

通过上述堆栈调用链发现触发异常时还没有执行测试用例,所以这个异常应该是出现在 framework 层面。由于缺失测试库导致的,查阅 Android R 行为变更,确认由于移除 android.test.base 库导致的问题,uiautomator1.0 使用该库加载并运行测试用例。



对于采用 uiautomator1.0 的业务线需要提前进行技术适配。通过上文可以看到,在抛异常时程序已经初始化了 uiautomator1.0 测试环境,因此 Android R 是系统支持 uiautomator1.0 框架 API 的,我们需要通过 app_process 命令启动一个 java 进程,在 Java 进程内部初始化测试服务,然后初始化 uiautomator1.0 测试框架就能正常使用 uiautomator1.0 API 了,不过需要手动维护用例执行顺序,不能使用 junit3 测试框架特性。

想要了解 Uiautomator 执行原理可以参考[Uiautomator 项目搭建与实现原理]


点击下方链接免费领取:性能测试+接口测试+自动化测试+测试开发+测试用例+简历模板+测试文档

http://qrcode.testing-studio.com/f?from=infoQ&url=https://ceshiren.com/t/topic/22265

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019.10.23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
Android R给自家UA工具挖坑_霍格沃兹测试开发学社_InfoQ写作社区