解释 CI 失败编辑

Kibana CI 使用 Buildkite 的一项名为“管道”的功能来自动化拉取请求和跟踪分支中代码的测试。管道通过 .buildkite/pipelines 文件夹中的 Pipelines 在存储库中定义。

有关 Buildkite 管道的更多信息,请参阅文档

Github 检查编辑

当测试失败时,将通过 Github 检查报告给 Github。我们目前将测试分为几个类别,这些类别并行运行以加快 CI 速度。像 ciGroup{X} 这样的组在 Github 中获得单个检查,而其他测试(如 linting 或类型检查)则获得自己的检查。

单击拉取请求对话选项卡中检查旁边的链接,您将转到该部分测试的日志输出。如果该日志输出被截断,或者没有清楚地识别出发生了什么,您通常可以通过直接访问 Buildkite 来获得更完整的信息。

在 Kibana 中查看作业执行编辑

要在 Buildkite 中查看作业执行的结果,请单击 @elasticmachine 留下的评论中的链接,或在 PR 底部的列表中搜索 kibana-ci 检查。此链接将带您进入失败的特定作业执行的顶级页面。

Buildkite pipeline view showing a few test failures
  1. Git 提交: 导致此构建的 git 提交。
  2. 测试结果:指向测试结果屏幕的链接,以及指向失败测试的日志和作业的快捷方式。功能测试捕获并存储每个特定测试的日志输出,并使它们在这些链接中可见。
  3. 管道步骤::已执行管道的细分,以及管道中每个步骤的单独日志输出。

调试功能性 UI 测试失败编辑

“管道步骤”中的日志包含 Info 级别的日志记录。要调试功能性 UI 测试,查看调试日志通常很有帮助。您可以通过单击 日志 (1) 来查看测试失败的详细信息。

Buildkite build screenshot

查看失败,我们首先查看错误和堆栈跟踪。在下面的示例中,此测试未能在超时内找到元素;错误:retry.try 超时:TimeoutError:等待元素被定位 By(css 选择器,[data-test-subj="createSpace"])

我们从堆栈跟踪中知道测试文件位于 test/accessibility/apps/spaces.ts 的第 50 行(此测试和堆栈跟踪上下文是 kibana/x-pack/,因此文件是 https://github.com/elastic/kibana/blob/main/x-pack/test/accessibility/apps/group1/spaces.ts#L50)。单击元素的函数是从 test/functional/page_objects/space_selector_page.ts https://github.com/elastic/kibana/blob/main/x-pack/test/functional/page_objects/space_selector_page.ts#L58 中的页面对象方法调用的

[00:03:36]             │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="createSpace"])
[00:03:36]             │      Wait timed out after 10020ms
[00:03:36]             │ info Taking screenshot "/dev/shm/workspace/parallel/24/kibana/x-pack/test/functional/screenshots/failure/Kibana spaces page meets a11y validations a11y test for click on create space page.png"
[00:03:37]             │ info Current URL is: https://127.0.0.1:61241/app/home#/
[00:03:37]             │ info Saving page source to: /dev/shm/workspace/parallel/24/kibana/x-pack/test/functional/failure_debug/html/Kibana spaces page meets a11y validations a11y test for click on create space page.html
[00:03:37]             └- ✖ fail: Kibana spaces page meets a11y validations a11y test for click on create space page
[00:03:37]             │      Error: retry.try timeout: TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="createSpace"])
[00:03:37]             │ Wait timed out after 10020ms
[00:03:37]             │     at /dev/shm/workspace/parallel/24/kibana/node_modules/selenium-webdriver/lib/webdriver.js:842:17
[00:03:37]             │     at runMicrotasks (<anonymous>)
[00:03:37]             │     at processTicksAndRejections (internal/process/task_queues.js:93:5)
[00:03:37]             │       at onFailure (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry_for_success.ts:17:9)
[00:03:37]             │       at retryForSuccess (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry_for_success.ts:57:13)
[00:03:37]             │       at Retry.try (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry.ts:32:14)
[00:03:37]             │       at Proxy.clickByCssSelector (/dev/shm/workspace/parallel/24/kibana/test/functional/services/common/find.ts:420:7)
[00:03:37]             │       at TestSubjects.click (/dev/shm/workspace/parallel/24/kibana/test/functional/services/common/test_subjects.ts:109:7)
[00:03:37]             │       at SpaceSelectorPage.clickCreateSpace (test/functional/page_objects/space_selector_page.ts:59:7)
[00:03:37]             │       at Context.<anonymous> (test/accessibility/apps/spaces.ts:50:7)
[00:03:37]             │       at Object.apply (/dev/shm/workspace/parallel/24/kibana/node_modules/@kbn/test/src/functional_test_runner/lib/mocha/wrap_function.js:73:16)

但我们不知道测试为什么没有找到该元素。可能是它不在正确的页面上,或者该元素已更改。

✖ fail: 行的正上方,有一行 info 正在截取屏幕截图...,它告诉我们要在 Google Cloud Storage (GCS) 上传报告: 中查找的屏幕截图的名称

单击该 png 的 [下载] 链接会显示此图像

Kibana spaces page meets a11y validations a11y test for click on create space page.png

如果我们使用正在运行的 Kibana 实例并检查元素,我们会发现 createSpace data-test-subj 属性位于堆栈管理中“空间”页面上的此按钮上

Kibana screenshot of Spaces page with developer tools open

我们知道测试不在正确的页面上以找到要单击的元素。我们在调试日志中看到了重复尝试查找该元素。如果我们滚动到这些重复尝试的开始,我们会看到测试做的第一件事是尝试单击 createSpace 元素。

[00:01:30]           └-> a11y test for manage spaces menu from top nav on Kibana home
[00:01:30]           └-> a11y test for manage spaces page
[00:01:30]           └-> a11y test for click on create space page
[00:01:30]             └-> "before each" hook: global before each for "a11y test for click on create space page"
[00:01:30]             │ debg TestSubjects.click(createSpace)

我们可以通过查看测试代码来确认这一点。

所以我们需要进一步回溯以找到测试打开“空间”页面的位置。事实证明,此测试之前的测试会导航到正确的页面,但该测试被跳过了(在 PR 中标记为 it.skip)。

it.skip('a11y test for manage spaces page', async () => {
  await PageObjects.spaceSelector.clickManageSpaces();

也许有人跳过了之前的测试,却没有意识到这些测试不是独立的。最佳实践是每个测试都是原子的,并且不依赖于任何其他测试的结果。但是在 UI 测试中,设置需要时间,我们通常需要针对描述块中的测试组进行优化。