在 Device Farm 中扩展自定义测试环境 - AWS Device Farm

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Device Farm 中扩展自定义测试环境

Device Farm 自定义模式使您能够运行的不仅仅是测试套件。在本节中,您将学习如何扩展测试套件和优化测试。

设置一个 PIN

某些应用程序要求您在设备PIN上设置。Device Farm 不支持PIN在设备上进行本地设置。但是,这是可能的,但需要注意以下几点:

  • 设备必须运行 Android 8 或更高版本。

  • 测试完成后PIN必须将其删除。

要在测试PIN中设置,请使用pre_testpost_test阶段来设置和移除PIN,如下所示:

phases: pre_test: - # ... among your pre_test commands - DEVICE_PIN_CODE="1234" - adb shell locksettings set-pin "$DEVICE_PIN_CODE" post_test: - # ... Among your post_test commands - adb shell locksettings clear --old "$DEVICE_PIN_CODE"

当你的测试套件开始时,PIN1234 就设置好了。在您的测试套件退出后,PIN即会移除。

警告

如果您在测试完成后没有将其PIN从设备中移除,则设备和您的帐户将被隔离。

通过所需的功能加快基于 Appium 的测试

使用 Appium 时,您可能会发现标准模式测试套件非常慢。这是因为 Device Farm 会应用默认设置,并且不会对您希望如何使用 Appium 环境做出任何假设。虽然这些默认值是围绕行业最佳实践建立的,但它们可能不适用于您的情况。要微调 Appium 服务器的参数,可以在测试规范中调整默认的 Appium 功能。例如,以下内容在 iOS 测试套件中将 usePrebuildWDA 功能设置为 true,以加快初始启动时间:

phases: pre_test: - # ... Start up Appium - >- appium --log-timestamp --default-capabilities "{\"usePrebuiltWDA\": true, \"derivedDataPath\":\"$DEVICEFARM_WDA_DERIVED_DATA_PATH\", \"deviceName\": \"$DEVICEFARM_DEVICE_NAME\", \"platformName\":\"$DEVICEFARM_DEVICE_PLATFORM_NAME\", \"app\":\"$DEVICEFARM_APP_PATH\", \"automationName\":\"XCUITest\", \"udid\":\"$DEVICEFARM_DEVICE_UDID_FOR_APPIUM\", \"platformVersion\":\"$DEVICEFARM_DEVICE_OS_VERSION\"}" >> $DEVICEFARM_LOG_DIR/appiumlog.txt 2>&1 &

Appium 功能必须是经过外壳转义的、带引号的结构。JSON

以下 Appium 功能是性能改进的常见来源:

noResetfullReset

这两种功能是相互排斥的,它们描述了 Appium 在每个会话完成后的行为。当 noReset 设置为 true 时,Appium 服务器不会在 Appium 会话结束时从应用程序中删除数据,实际上不会进行任何清理。fullReset 会在会话关闭后从设备中卸载并清除所有应用程序数据。有关更多信息,请参阅 Appium 文档中的 Reset Strategies

ignoreUnimportantViews(仅限 Android)

指示 Appium 将 Android 界面层次结构仅压缩为测试的相关视图,从而加快某些元素的查找速度。但是,这可能会破坏一些XPath基于测试套件,因为界面布局的层次结构已更改。

skipUnlock(仅限 Android)

通知 Appium 当前未设置任何PIN代码,这会在屏幕关闭事件或其他锁定事件发生后加快测试速度。

webDriverAgentUrl(仅限 iOS)

指示 Appium 假设一个基本的 iOS 依赖项已经在运行并且可以在指定时接受HTTP请求。webDriverAgent URL如果 webDriverAgent 尚未启动并运行,Appium 在测试套件开始时可能需要一些时间才能启动 webDriverAgent。如果您自己启动 webDriverAgent 并在启动 Appium 时将 webDriverAgentUrl 设置为 http://localhost:8100,则可以更快地启动测试套件。请注意,切勿将此功能与 useNewWDA 功能一起使用。

您可以使用以下代码通过设备本地端口 8100 上的测试规范文件启动 webDriverAgent,然后将其转发到测试主机的本地端口8100(这允许您将 webDriverAgentUrl 的值设置为 http://localhost:8100)。在定义了任何用于设置 Appium 和 webDriverAgent 环境变量的代码之后,应在安装阶段运行此代码:

# Start WebDriverAgent and iProxy - >- xcodebuild test-without-building -project /usr/local/avm/versions/$APPIUM_VERSION/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -derivedDataPath $DEVICEFARM_WDA_DERIVED_DATA_PATH -destination id=$DEVICEFARM_DEVICE_UDID_FOR_APPIUM IPHONEOS_DEPLOYMENT_TARGET=$DEVICEFARM_DEVICE_OS_VERSION GCC_TREAT_WARNINGS_AS_ERRORS=0 COMPILER_INDEX_STORE_ENABLE=NO >> $DEVICEFARM_LOG_DIR/webdriveragent_log.txt 2>&1 & iproxy 8100 8100 >> $DEVICEFARM_LOG_DIR/iproxy_log.txt 2>&1 &

然后,您可以将以下代码添加到测试规范文件中,以确保 webDriverAgent 成功启动。在确保 Appium 成功启动后,应在预测试阶段结束时运行此代码:

# Wait for WebDriverAgent to start - >- start_wda_timeout=0; while [ true ]; do if [ $start_wda_timeout -gt 60 ]; then echo "WebDriverAgent server never started in 60 seconds."; exit 1; fi; grep -i "ServerURLHere" $DEVICEFARM_LOG_DIR/webdriveragent_log.txt >> /dev/null 2>&1; if [ $? -eq 0 ]; then echo "WebDriverAgent REST http interface listener started"; break; else echo "Waiting for WebDriverAgent server to start. Sleeping for 1 seconds"; sleep 1; start_wda_timeout=$((start_wda_timeout+1)); fi; done;

有关 Appium 支持的功能的更多信息,请参阅 Appium 文档中的 Appium Desired Capabilities

在测试运行APIs后使用 Webhook 等

在每个测试套件使用 curl 完毕后,您可以让 Device Farm 调用 webhook。执行此操作的过程因目的地和格式而异。对于您的特定 webhook,请参阅该 webhook 的文档。以下示例会在每次测试套件完成时向 Slack webhook 发布一条消息:

phases: post_test: - curl -X POST -H 'Content-type: application/json' --data '{"text":"Tests on '$DEVICEFARM_DEVICE_NAME' have finished!"}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

有关在 Slack 中使用 webhook 的更多信息,请参阅 Slack 参考中的使用 Webhook 发送第一条 Slack 消息。API

您不仅局限于使用 curl 来调用 webhook。测试包可以包含额外的脚本和工具,前提是它们与 Device Farm 执行环境兼容。例如,您的测试包可能包含向其他人发出请求的辅助脚本APIs。确保将所有必需的软件包与测试套件的要求一起安装。要添加在测试套件完成后运行的脚本,请将该脚本包含在测试包中,并将以下内容添加到测试规范中:

phases: post_test: - python post_test.py
注意

您有责任维护测试包中使用的任何API密钥或其他身份验证令牌。我们建议您将任何形式的安全凭证排除在源代码控制之外,使用权限尽可能少的证书,并尽可能使用可撤销的短期令牌。要验证安全要求,请参阅您APIs使用的第三方的文档。

如果您计划将 AWS 服务用作测试执行套件的一部分,则应使用在测试套件之外生成并包含在测试包中的IAM临时证书。这些证书应具有最少的授予权限和最短的生命周期。有关创建临时证书的更多信息,请参阅《IAM用户指南》中的申请临时安全证书

向测试包中添加额外文件

您可能希望在测试中使用其他文件作为额外配置文件或其他测试数据。您可以在将这些额外文件上传到 AWS Device Farm之前将其添加到测试包中,然后通过自定义环境模式访问这些文件。从根本上讲,所有测试包上传格式(ZIPIPAAPK、JAR、、等)都是支持标准ZIP操作的包存档格式。

在将文件上传到测试存档之前,您可以使用以下命令将其添加到 AWS Device Farm 测试存档:

$ zip zip-with-dependencies.zip extra_file

要获取额外文件的目录,请执行以下操作:

$ zip -r zip-with-dependencies.zip extra_files/

对于除IPA文件之外的所有测试包上传格式,这些命令都能按预期运行。对于IPA文件,尤其是在与一起使用时XCUITests,由于 iOS 测试包的 AWS Device Farm 重新设计方式,我们建议您将任何多余的文件放在略有不同的位置。构建 iOS 测试时,测试应用程序目录将位于另一个名为的目录中 Payload.

例如,此类 iOS 测试目录可能是这样的:

$ tree . └── Payload └── ADFiOSReferenceAppUITests-Runner.app ├── ADFiOSReferenceAppUITests-Runner ├── Frameworks │ ├── XCTAutomationSupport.framework │ │ ├── Info.plist │ │ ├── XCTAutomationSupport │ │ ├── _CodeSignature │ │ │ └── CodeResources │ │ └── version.plist │ └── XCTest.framework │ ├── Info.plist │ ├── XCTest │ ├── _CodeSignature │ │ └── CodeResources │ ├── en.lproj │ │ └── InfoPlist.strings │ └── version.plist ├── Info.plist ├── PkgInfo ├── PlugIns │ ├── ADFiOSReferenceAppUITests.xctest │ │ ├── ADFiOSReferenceAppUITests │ │ ├── Info.plist │ │ └── _CodeSignature │ │ └── CodeResources │ └── ADFiOSReferenceAppUITests.xctest.dSYM │ └── Contents │ ├── Info.plist │ └── Resources │ └── DWARF │ └── ADFiOSReferenceAppUITests ├── _CodeSignature │ └── CodeResources └── embedded.mobileprovision

对于这些XCUITest软件包,请将任何额外的文件添加到以结尾的目录中 .app 里面 Payload 目录。例如,以下命令显示如何向此测试包中添加文件:

$ mv extra_file Payload/*.app/ $ zip -r my_xcui_tests.ipa Payload/

将文件添加到测试包时,根据其上传格式, AWS Device Farm 中的交互行为可能会略有不同。如果上传文件使用ZIP文件扩展名,则 AWS Device Farm 将在测试之前自动解压缩上传内容,并将解压缩后的文件留在与文件所在的位置 $DEVICEFARM_TEST_PACKAGE_PATH 环境变量。(这意味着,如果你添加了一个名为的文件 extra_file 到存档的根目录,如第一个示例所示,它将位于 $DEVICEFARM_TEST_PACKAGE_PATH/extra_file 在测试期间)。

举一个更实际的例子,如果你是 Appium Testng 用户,想要添加一个 testng.xml 包含测试的文件,您可以使用以下命令将其包含在存档中:

$ zip zip-with-dependencies.zip testng.xml

然后,您可以在自定义环境模式下将测试命令更改为以下内容:

java -D appium.screenshots.dir=$DEVICEFARM_SCREENSHOT_PATH org.testng.TestNG -testjar *-tests.jar -d $DEVICEFARM_LOG_DIR/test-output $DEVICEFARM_TEST_PACKAGE_PATH/testng.xml

如果您的测试包上传扩展插件不是ZIP(例如APKIPA、或JAR文件),则上传的包文件本身可在以下网址找到 $DEVICEFARM_TEST_PACKAGE_PATH。 由于这些文件仍然是存档格式的文件,因此您可以解压缩该文件,以便从中访问其他文件。例如,以下命令会将测试包的内容(对于APKIPA、或JAR文件)解压缩到 /tmp 目录:

unzip $DEVICEFARM_TEST_PACKAGE_PATH -d /tmp

如果是APK或JAR文件,您会发现多余的文件已解压缩到 /tmp 目录(例如 /tmp/extra_file)。 对于IPA文件,如前所述,多余文件将位于以结尾的文件夹中稍有不同的位置 .app,它在里面 Payload 目录。例如,根据上面的IPA示例,可以在该位置找到该文件 /tmp/Payload/ADFiOSReferenceAppUITests-Runner.app/extra_file (可引用为 /tmp/Payload/*.app/extra_file).