在 Device Farm 中擴充自訂測試 - AWS Device Farm

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Device Farm 中擴充自訂測試

Device Farm 自訂模式可讓您執行的不僅僅是測試套件。在本節中,您將學習如何擴展測試套件並最佳化測試。

設置一個 PIN

某些應用程式會要求您在裝置PIN上設定 a。Device Farm 不支援以本機方式PIN在裝置上設定 a。但是,這可能需要以下警告:

  • 該設備必須運行安卓 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"

當您的測試套件開始時,將設置 PIN 1234。測試套件結束後,即PIN會移除。

警告

如果您沒有在測試完成後PIN從設備中刪除,則該設備和您的帳戶將被隔離。

通過所需功能加快基於 Appium 的測試

使用 Appium 時,您可能會發現標準模式測試套件非常慢。這是因為 Device Farm 會套用預設設定,而且不會對您要如何使用 Appium 環境做任何假設。雖然這些預設值是根據業界最佳實務建立的,但它們可能不適用於您的情況。要微調 Appium 服務器的參數,您可以調整測試規範中的默認 Appium 功能。例如,以下內容將 iOS 測試套件true中的usePrebuildWDA功能設置為以加快初始啟動時間:

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 文檔中的重置策略

ignoreUnimportantViews(僅限安卓系統)

指示 Appium 將 Android UI 層次結構僅壓縮到用於測試的相關視圖,從而加快某些元素查找速度。但是,這可能會破壞某些XPath基於測試套件,因為 UI 佈局的層次結構已更改。

skipUnlock(僅限安卓系統)

通知 Appium 當前沒有設置PIN代碼,這可以加快屏幕關閉事件或其他鎖定事件後的測試。

webDriverAgentUrl(僅適用於 iOS 版本)

指示 Appium 假設基本的 iOS 依賴項已經在運行webDriverAgent,並可用於在指定的接受HTTP請求。URL如果尚webDriverAgent未啟動並運行,則在測試套件開始時可能需要 Appium 一些時間才能啟動. webDriverAgent 如果您啟動webDriverAgent自己並設置webDriverAgentUrl為啟動 Appium http://localhost:8100 時,則可以更快地啟動測試套件。請注意,此功能絕對不應與該useNewWDA功能一起使用。

您可以使用以下代碼webDriverAgent從設備本地端口上的測試規格文件開始8100,然後將其轉發到測試主機的本地端口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 所需功能

在測試運行APIs後使用 Webhook 和其他

在每個測試套件完成使用後,您可以讓 Device Farm 調用 curl 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 使用網路掛接的詳細資訊,請參閱 Slack 參考資料中的使用 Webhook 傳送您的第一則 Slack 訊息。API

您不僅限於使用調curl用網絡掛鉤。測試套件可以包含額外的指令碼和工具,只要它們與 Device Farm 執行環境相容。例如,您的測試套件可能包含向其他人發出要求的輔助指令碼APIs。確保所有必需的軟件包都與測試套件的要求一起安裝。要添加在測試套件完成後運行的腳本,請在測試包中包含該腳本,並將以下內容添加到測試規範中:

phases: post_test: - python post_test.py
注意

維護測試包中使用的任何API密鑰或其他身份驗證令牌是您的責任。我們建議您將任何形式的安全憑證保留在原始檔控制之外、使用具有最少權限的認證,並儘可能使用可撤銷的短期權杖。若要確認安全性需求,請參閱您所使用之協力廠商APIs的說明文件。

如果您打算將 AWS 服務用作測試執行套件的一部分,則應使用在測試套件之外生成並包含在測試包中的IAM臨時憑據。這些認證應具有最少授予的權限和最短的壽命。如需建立臨時登入資料的詳細資訊,請參閱IAM使用者指南中的要求臨時安全登入資料。

添加額外的文件到您的測試包

您可能希望使用其他文件作為測試的一部分,無論是額外的配置文件或其他測試數據。您可以先將這些其他檔案新增至測試套件,然後再將其上傳至 AWS Device Farm,然後從自訂環境模式存取這些檔案。基本上,所有測試套件上傳格式 (ZIPIPA、APKJAR、等) 都是支援標準ZIP作業的套件歸檔格式。

您可以使用以下命令將文件添加到 AWS Device Farm 測試存檔中,然後再將其上傳到中:

$ zip zip-with-dependencies.zip extra_file

對於額外文件的目錄:

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

除了檔案以外的所有測試套IPA件上傳格式,這些指令都能如預期般運作。對於IPA文件,尤其是與一起使用時XCUITests,我們建議您將任何額外的文件放在略有不同的位置,由於如何 AWS Device Farm 退出 iOS 測試包。構建 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

然後,您可以將自訂環境模式中的 test 命令變更為以下內容:

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(例如APK,IPA,或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).