記Android R(SDK=30)系統執行UiAutomator1.0異常

最近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 項目搭建與實現原理

相關文章
相關標籤/搜索