首页 > 解决方案 > 运行调用 ADB 命令的 Python 脚本以在 Jenkins 中运行 UI 测试

问题描述

我有一个在 Jenkins 管道上运行的 Python 脚本。此脚本读取 JSON 文件,然后使用 ADB 执行 UI 测试。

如果我只运行 ADB 命令,它就会成功执行。但是当我执行管道时,它会引发错误。奇怪的是,错误是在其他打印之前记录的……这是怎么回事?

詹金斯日志:

+ python run_tests.py Login
onError: commandError=true message=INSTRUMENTATION_FAILED: com.myproj.adhoctest.test/com.myproj.MyprojTestRunner
android.util.AndroidException: INSTRUMENTATION_FAILED: com.myproj.adhoctest.test/com.myproj.MyprojTestRunner
    at com.android.commands.am.Instrument.run(Instrument.java:486)
    at com.android.commands.am.Am.runInstrument(Am.java:194)
    at com.android.commands.am.Am.onRun(Am.java:80)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:54)
    at com.android.commands.am.Am.main(Am.java:50)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:340)
INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.myproj.adhoctest.test/com.myproj.MyprojTestRunner}
INSTRUMENTATION_STATUS: id=ActivityManagerService
INSTRUMENTATION_STATUS_CODE: -1
Running testcase: LoginScreenshot
/usr/local/bin/adb shell am instrument -w -r -e debug false -e executeScreenshots true -e class 'com.myproj.screenshot.LoginScreenshot' com.myproj.adhoctest.test/com.myproj.MyprojTestRunner

Jenkinsfile(部分):

    stage('Generate screenshots') {
      steps {
        sh '''
cat > run_tests.py << EOF1
import json
import sys
import subprocess

screensList = sys.argv[1].split(',')

with open('results.json') as json_file:
  data = json.load(json_file)
  for screen in screensList:
    for item in data['Items']:
      if screen == item['screen']['S']:
        for test in item['android']['L']:
          testClass = test['S']
          print('Running testcase: ' + testClass)
          cmd = "/usr/local/bin/adb shell am instrument -w -r -e debug false -e executeScreenshots true -e class 'com.myproj.screenshot.TEST_CLASS' com.myproj.adhoctest.test/com.myproj.MyprojTestRunner".replace('TEST_CLASS', testClass)
          print(cmd)
          subprocess.call(cmd, shell=True)
EOF1
        '''

        sh '''
function change_locale {
  echo "Changing device locale to $1"
  /usr/local/bin/adb shell "setprop persist.sys.locale $1; stop; start"
  sleep 20
}

function generate_specific_screenshots {
  change_locale $1
  python run_tests.py "$SCREENS"
}

generate_specific_screenshots $USER_LOCALE
        '''
      }
    }

标签: androidpythonjenkins

解决方案


测试失败,因为应用程序没有正确构建。

要构建 APK,必须使用以下命令:

./gradlew clean assembleAdhoctestDebug assembleAdhoctestDebugAndroidTest

这将生成两个 APK,两者都必须安装在模拟器中。

/usr/local/bin/adb root

/usr/local/bin/adb push app/build/outputs/apk/adhoctest/debug/app-adhoctest-debug.apk /data/local/tmp/com.myproj.adhoctest

/usr/local/bin/adb shell pm install -t -r "/data/local/tmp/com.myproj.adhoctest"

/usr/local/bin/adb push app/build/outputs/apk/androidTest/adhoctest/debug/app-adhoctest-debug-androidTest.apk /data/local/tmp/com.myproj.adhoctest.test

/usr/local/bin/adb shell pm install -t -r "/data/local/tmp/com.myproj.adhoctest.test"

推荐阅读