无法将 APK 上传到 App Center 以执行 Espresso UI 测试

Unable to upload APKs to App Center to perform Espresso UI testing

我会尽量详细。请原谅任何格式或语言问题。

我想做什么?

我正在尝试制作一个应用,将 APK 上传到 Appcenter,以便在用户提供的任何设备上执行 UI 测试用例。完成后,我的应用程序将显示执行的 UI 个测试的结果。

我做的怎么样?

应用中心提供了大量API可以查看here。执行 UI 测试是一个 4 步过程。

  1. 创建一个新测试运行。 这是有效的
  2. 创建要上传的文件的哈希值。 这是有效的
  3. 上传实际文件。 我不断收到 400 错误请求或 "payload is too big" 错误。我的 APK 文件只有 1 MB,上传通过 Appcenter CLI.
  4. 执行 运行 创建的测试。 此 API 无效。可能是因为第 3 步失败.

我需要什么帮助?

上面的第 3 步对我不起作用。当我尝试通过 curl/postman 上传 APK 文件时,我不断收到以下错误。

卷曲命令:

curl -i -F "data=@app-debug-androidTest.apk" -H "X-API-Token:API_TOKEN_HERE" -H "Content-Type:application/json" -X POST https://api.appcenter.ms/v0.1/apps/{ORG_NAME}/{APP_NAME}/test_runs/{TEST_RUN_ID_CREATED_IN_STEP_1}/files

收到错误:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Payload Too Large</pre>
    </body>
</html>

具有讽刺意味的是,当 Appcenter CLI 执行完全相同的 API 时,它起作用了。如果 UI 测试作为构建步骤的一部分执行,应用中心将使用完全相同的程序和一组 API 来上传 APK。请查看完整日志 here。出于格式化目的,我没有内联添加。

我做错了什么?

您在第 3 步中的 curl 命令正在尝试将二进制文件作为多部分表单数据上传(在 App Center CLI 代码的 API spec). The /files endpoint expects no file upload, but is preparing the upload internally and then returns the upload URL to you. See here 中不存在的参数 data 中:

const directUrl = await this.getDirectUploadUrl(this._client, testRunId, file);
await this.makeDirectUpload(directUrl, file);

从您的 curl 命令中删除 -F "data=@app-debug-androidTest.apk",然后检查此测试 运行.

的上传响应 URL

一天半后,可能两天后我解决了这个问题。我发布了一份详尽的文档 here & 下面是较短的版本。

创建新测试后 运行,您需要为从 gradle 命令 $ ./gradlew clean assembleDebug assembleAndroidTest 生成的 APK 上传文件哈希。在 /hashes/batch API 的响应中,location 键中提到了 URL。 API 的正文类似于:

[{
        "file_type":"app-file",
        "checksum":"df798b4d07597db804546b8ca723780992811111", //Calculate your file's SHA-1 by using shasum util
        "relative_path":"app-debug.apk"
}]

现在我们上传 URL 上的文件以响应 /hashes/batch API 并使用 form-data 格式的以下正文参数。

  • relative_path //文件名就可以了
  • file //实际文件
  • file_type //构建 APK 的应用文件和包含 espresso 测试的 APK 的测试文件

如果文件上传正常,可以运行到/start API终点执行测试