• Android R给自家UA工具挖坑


    最近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 using
    UI 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.html
    for 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
    
    
    • 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

    异常触发流程

    通过分析发现是因为找不到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 项目搭建与实现原理]
    (https://testerhome.com/articles/20078)

    更多技术文章

  • 相关阅读:
    区块链交易平台开发流程
    FPGA_简单工程_拨码开关
    Flink写入kafka的自定义Key值
    ocr的场景应用--发票识别
    网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍
    并发基本原理(四):AQS源码解析1-ReentrantLock的lock实现原理
    SpringBoot详解配置文件
    c#中的消息处理函数和vc中的消息处理函数区别
    内核中自旋锁的使用
    Matlab 删除含有特定数值的行 / Matlab定义excel表头
  • 原文地址:https://blog.csdn.net/Tester_muller/article/details/126475717