最近Android发布了AndroidStudio 3.6稳定版,升级后明显能体验到好多细节的提高,最大的提高莫过于能够建立Android R预览版的模拟器了,而且模拟器能够设置多个尺寸的屏幕。Android R的xm6模拟器能够直接运行arm架构的程序,之后开发过程当中不再用为测试机担心了。可是在执行UiAutomator1脚本时就存在了不兼容问题。html
可是在使用Android R模拟器进行开发工做中发现执行UiAutomator1.0脚本出现以下异常:java
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
经过分析发现是由于找不到Landroid/test/RepetitiveTest类文件。那么分析一下堆栈信息看异常具体出如今哪里?android
在执行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方法,因此须要继续定位异常缘由
ui
com.android.uiautomator.testrunner.UiAutomatorTestRunner$WatcherResultPrinter.startTest(UiAutomatorTestRunner.java:297)是真正触发异常的位置,能够看到第一次引用android.test.RepetitiveTest接口文件时产生了java.lang.NoClassDefFoundError:异常信息。
设计
经过上述堆栈调用链发现触发异常时尚未执行测试用例,因此这个异常应该是出如今framework层面。因为运行环境是Android R预览版,没法查阅对应的源码,因此没法判定为系统bug仍是Android R系统开始再也不支持uiautomator1.0测试服务。code
对于采用uiautomator1.0测试框架的业务线须要提早对相关技术进行调研,能够提前设计应对方案。经过上文能够看到,在抛异常时程序已经初始化了uiautomator1.0测试环境,因此要实现uiautomator1.0兼容Android R运行时本身注册测试服务并管理用例便可。htm
想要了解Uiautomator执行原理能够参考Uiautomator 项目搭建与实现原理