解释 CI 失败
编辑解释 CI 失败编辑
Kibana CI 使用 Buildkite 的一项名为“管道”的功能来自动化拉取请求和跟踪分支中代码的测试。管道通过 .buildkite/pipelines
文件夹中的 Pipelines
在存储库中定义。
有关 Buildkite 管道的更多信息,请参阅文档。
Github 检查编辑
当测试失败时,将通过 Github 检查报告给 Github。我们目前将测试分为几个类别,这些类别并行运行以加快 CI 速度。像 ciGroup{X}
这样的组在 Github 中获得单个检查,而其他测试(如 linting 或类型检查)则获得自己的检查。
单击拉取请求对话选项卡中检查旁边的链接,您将转到该部分测试的日志输出。如果该日志输出被截断,或者没有清楚地识别出发生了什么,您通常可以通过直接访问 Buildkite 来获得更完整的信息。
在 Kibana 中查看作业执行编辑
要在 Buildkite 中查看作业执行的结果,请单击 @elasticmachine
留下的评论中的链接,或在 PR 底部的列表中搜索 kibana-ci
检查。此链接将带您进入失败的特定作业执行的顶级页面。
- Git 提交: 导致此构建的 git 提交。
- 测试结果:指向测试结果屏幕的链接,以及指向失败测试的日志和作业的快捷方式。功能测试捕获并存储每个特定测试的日志输出,并使它们在这些链接中可见。
- 管道步骤::已执行管道的细分,以及管道中每个步骤的单独日志输出。
调试功能性 UI 测试失败编辑
“管道步骤”中的日志包含 Info
级别的日志记录。要调试功能性 UI 测试,查看调试日志通常很有帮助。您可以通过单击 日志 (1) 来查看测试失败的详细信息。
查看失败,我们首先查看错误和堆栈跟踪。在下面的示例中,此测试未能在超时内找到元素;错误: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 实例并检查元素,我们会发现 createSpace
data-test-subj 属性位于堆栈管理中“空间”页面上的此按钮上
我们知道测试不在正确的页面上以找到要单击的元素。我们在调试日志中看到了重复尝试查找该元素。如果我们滚动到这些重复尝试的开始,我们会看到测试做的第一件事是尝试单击 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 测试中,设置需要时间,我们通常需要针对描述块中的测试组进行优化。