【问题标题】:How to retry only failed tests in the CI job run on Gitlab?如何在 Gitlab 上运行的 CI 作业中仅重试失败的测试?
【发布时间】:2020-08-27 09:23:32
【问题描述】:

我们的自动化测试在 gitlab CI 环境中运行。我们有一个包含大约 80 个测试的回归套件。 如果测试由于某些间歇性问题而失败,则 CI 作业会失败,并且由于下一阶段依赖于回归阶段,因此管道会被阻塞。 我们重试该作业以重新运行回归套件,期望这次它会通过,但这次其他一些测试失败了。 所以,我的问题是: 是否有任何能力在重试失败的 CI 作业时,只运行失败的测试(不是整个套件)?

【问题讨论】:

    标签: continuous-integration automated-tests gitlab-ci


    【解决方案1】:

    您可以在为作业指定参数时使用retry 关键字来定义作业可以自动重试多少次:https://docs.gitlab.com/ee/ci/yaml/#configuration-parameters

    【讨论】:

    • 嗨,金。首先,感谢您的回答。我浏览了您共享的链接,虽然重试有很多功能,但我的用例有所不同。我希望仅对失败的测试进行重试,而不是对整个工作进行重试。但是,我不确定是否可以在 CI 级别处理。
    【解决方案2】:

    [仅重试失败的场景]

    是的,但这取决于。让我解释。我将提到可以执行的伪步骤以仅重试失败的场景。这些步骤特定于 pytest,但可以根据测试运行程序进行修改。

    1. 使用--last-failed 执行测试场景。首先,将执行所有 80 个场景。
    2. 测试运行程序创建一个包含失败测试列表的元数据文件。例如,pytest 创建一个文件夹.pytest_cache,其中包含lastfailed 文件和失败场景的列表。
    3. 我们现在必须在 GitLab 缓存中添加 .pytest_cache 文件夹和 key=<gitlab-pipeline-id>
    4. 用户检查有 5 次失败并重新运行失败的作业。
    5. 重试作业时,它会看到现在 .pytest_cache 文件夹存在于 GitLab 缓存中,并将该文件夹复制到您的测试运行目录。 (如果不存在用于处理第一次执行的缓存,则不应失败)
    6. 您使用相同的参数--last-failed 执行相同的测试用例来执行之前失败的测试。
    7. 在重新运行时,将执行 5 个测试用例。

    假设:

    1. 您正在使用的测试运行程序会创建一个元数据文件,例如 pytest。

    需要 POC:

    • 我没有为此做过 POC,但理论上,它看起来是可能的。我唯一的疑问是 Gitlab 如何解析结果。理想情况下,在最终结果中,所有 80 个场景都应该是pass。如果它不能以这种方式解决,那么我们必须有 2 个工作。 execute tests -> [manual] execute failed tests 得到 2 个解析结果。我相信有 2 个阶段,它肯定会奏效。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 2017-11-14
      • 2023-03-22
      • 2014-07-07
      • 2019-09-28
      • 2021-09-28
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多