

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

# 通过所需的功能加快 Device Farm 中基于 Appium 的测试
<a name="custom-test-environments-extending-speed"></a>

使用 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 功能必须是经过 shell 转义的、带引号的 JSON 结构。

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

`noReset` 和 `fullReset`  
这两种功能是相互排斥的，它们描述了 Appium 在每个会话完成后的行为。当 `noReset` 设置为 `true` 时，Appium 服务器不会在 Appium 会话结束时从应用程序中删除数据，实际上不会进行任何清理。`fullReset` 会在会话关闭后从设备中卸载并清除所有应用程序数据。有关更多信息，请参阅 Appium 文档中的 [Reset Strategies](http://appium.io/docs/en/writing-running-appium/other/reset-strategies/)。

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

`skipUnlock`（仅限 Android）  
通知 Appium 当前没有设置 PIN 码，这样可以在屏幕关闭事件或其他锁定事件发生后加快测试速度。

`webDriverAgentUrl`（仅限 iOS）  
指示 Appium 假设一个基本的 iOS 依赖项 `webDriverAgent` 已经在运行，并且可以在指定 URL 上接受 HTTP 请求。如果 `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](http://appium.io/docs/en/writing-running-appium/caps/)。

有关扩展测试套件和优化测试的更多方法，请参阅 [在 Device Farm 中扩展自定义测试环境](custom-test-environments-extending.md)。