android - 运行调用 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
'''
}
}
解决方案
测试失败,因为应用程序没有正确构建。
要构建 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"
推荐阅读
- laravel - Laravel 应用程序无法在本地写入文件,使用 docker 抛出权限被拒绝
- ios - 将屏幕截图上传到 iTunes Connect
- c# - 在 C# 中,是否可以将应该由 String 的 format 方法格式化的对象作为数组传递?
- html - 是什么让最后一张照片与其他照片相比如此之大?
- vb.net - VB.NET如何用类似的程序控制多个控件
- windows - Powershell 脚本,用于搜索特定程序,然后输出是否已安装
- python - Python py不在其他PC上执行
- xcode - React-native 导入抛出“无法解析模块”,即使 IDE 完美地找到它
- r - 在 for 循环中以 pdf 格式保存 2-plot 图形
- c# - FlexCel 创建了损坏的 xlsx 文件