天天看點

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      

異常觸發流程

通過分析發現是因為找不到Landroid/test/RepetitiveTest類檔案。那麼分析一下堆棧資訊看異常具體出現在哪裡?

在執行UiAutomator1.0測試用例時,是在UiAutomatorTestRunner類中初始化測試資源并執行測試用例的。是以對異常堆棧資訊的分析從UiAutomatorTestRunner類開始。

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

源碼如圖,可以看到此處不存在異常行為,需要定位下一個堆棧資訊

Android R給自家UA工具挖坑

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

通過分析源碼會發現是周遊執行測試用例時産生的異常,并且此處是

Android R給自家UA工具挖坑

**junit.framework.TestResult.startTest **僅僅調用了WatcherResultPrinter#startTest方法,是以需要繼續定位異常原因

Android R給自家UA工具挖坑

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

是真正觸發異常的位置,可以看到第一次引用android.test.RepetitiveTest接口檔案時産生了 java.lang.NoClassDefFoundError: 異常資訊。

Android R給自家UA工具挖坑

1

通過上述堆棧調用鍊發現觸發異常時還沒有執行測試用例,是以這個異常應該是出現在framework層面。由于缺失測試庫導緻的,查閱Android R行為變更,确認由于移除android.test.base庫導緻的問題,uiautomator1.0使用該庫加載并運作測試用例。