运行调用ADB命令的Python脚本以在Jenkins中运行UI测试

时间:2019-05-02 15:54:32

标签: android python jenkins

我有一个在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
        '''
      }
    }

1 个答案:

答案 0 :(得分:0)

测试失败,因为该应用的构建方式不正确。

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

./gradlew clean assembleAdhoctestDebug assembleAdhoctestDebugAndroidTest

这将生成两个APK,这两个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"