处理构建和测试失败
在构建运行期间,您通常会遇到以下其中一种失败类型:
测试失败 — 在构建过程中尝试的单元测试或功能测试失败。
构建问题 — 构建过程中发生的任何其他问题:无法访问远程存储库、获取或上传构建工件失败、编译错误等。
在 TeamCity 中,有多种方法可以检测和调查构建问题。
构建结果页面 显示关于此次构建运行的最详细信息。 其 概述 选项卡显示了可展开的部分,其中包含本次运行期间发生的构建和测试问题的摘要。

构建问题首次出现时,会在构建的状态消息中添加“(新)”。 这使您在浏览构建历史时能够快速区分出独特和重复的问题。

点击任何问题以查看与此问题相关的 构建日志部分。

失败的测试还会显示 当前失败/First failure(首次失败) 切换按钮,允许您快速导航到首次出现此重复问题的构建。

如果您正在查看较旧构建的结果,而较新的构建已经完成且没有相同的测试失败,则该失败将被划掉。 在这种情况下,指向此较新构建的 已修复 选项卡是可见的。

tip
成功的 历史构建不会显示为已修复失败测试的构建。
如果测试的状态经常在失败和成功之间切换,TeamCity 会将此类测试标记为 不稳定。 请参阅专门的 不稳定测试 部分以获取更多信息。
项目的 问题 选项卡提供了所有当前活动构建问题的概览,包括子项目中的问题。

此页面允许您在构建和测试失败之间切换,并按问题的状态进行筛选。
TeamCity 的问题管理功能围绕两个基本概念:调查和静音。
已调查 问题是指已分配给 TeamCity 用户的问题。 这些用户负责解决相应的构建问题和/或测试失败。
用户可以在 TeamCity 页眉中看到分配给他们的调查总数。 他们可以点击此 UI 元素打开 我的调查 页面,查看这些调查的详细信息。

tip
在 个人设置 中启用了 突出显示我的更改和调查 选项的用户,可以更轻松地在 TeamCity UI 中发现分配给他们的调查。
TeamCity 使用警察图标来可视化已调查的问题。 将鼠标悬停在此图标上,将显示有关问题的更多信息,并允许用户重新分配问题或手动将其标记为已解决。

如果用户将调查标记为已修复,图标颜色将变为绿色。 该图标将一直显示,直到新的运行完成且未遇到相同的问题。

手动将问题状态设置为“已修复”会减少 TeamCity 头部中的用户调查计数器,但如果问题持续出现,仍不能防止后续构建失败。 如果您希望 TeamCity 忽略此问题,请 将其静音而不是标记为已修复。
TeamCity 可自动创建问题调查,并将其分配给最有可能对这些故障负责的用户。 为此,请配置 调查自动分配器 构建功能。
已静音 问题是指不会阻止构建报告成功完成的问题。 由于被静音问题而失败的构建将显示为成功完成,并显示静音问题的数量。

您可以静音构建问题或测试,以暂时忽略已知的预期问题,忽略预计会失败的测试,或确保后续步骤或 Build Chain(构建链) 配置即使在构建遇到问题时也能运行。
tip
TeamCity 使用扬声器图标来可视化静音问题。 将鼠标悬停在此图标上可显示有关此问题的更多信息。


仅对 "At least one test failed" (至少有一个测试失败) 构建失败条件 失效的构建静音测试有效,而对其他条件无效。 如果您的构建适用于任何其他失败条件(例如,非零退出代码),即使失败的测试被静音了,构建仍将失败。
当存在失败但被静音的测试时,您的构建脚本可能需要进行调整以使构建成功。 确保构建不会因其他构建失败条件(例如, "如果构建过程退出代码不为零则失败" )而失败,以防遇到的唯一错误是测试失败。 请查看相关问题 TW-16784 以获取更多详情。
两者 构建结果页面 和 Problems 选项卡 显示的 UI 元素允许用户静音、取消静音、调查问题、将其标记为已修复或重新分配给不同的用户。 要一次对多个问题应用相同的操作,请转到 问题 选项卡并选择所需的条目。

编辑调查和静音时,TeamCity 允许您指定以下设置:
调查/禁音范围。 选择“Project wide”以在属于同一项目(包括其子项目)的所有配置中的构建中静音/调查此问题。 “Selected build configuration”(选定构建配置)选项允许您仅对所需的配置静音/调查问题。
tip
调查和负责人。 已静音的问题会让失败的构建看起来成功,可能会掩盖潜在的问题。 鉴于此,我们建议将静音与调查配对,并避免对无人调查的问题保持静音。
自动取消静音/解决策略。 您可以指定 TeamCity 恢复问题或将其标记为已修复的条件。
修正后自动解决
——如果问题在较新的版本中得到解决,TeamCity 会取消其静音并/或关闭相关调查。 这是默认情况,可让您的团队在问题再次出现在后续构建中时迅速作出响应。一个“已解决”的问题要么是状态被手动更改了的问题(请参阅 调查 部分),要么是在新版本中消失的问题。 另见: 与分支的关系。
手动
— 只有 TeamCity 用户可以关闭活动调查并撤销静音。 由于这些测试不稳定且成功运行不能保证问题得到解决,建议在静音/调查 flaky tests时使用此模式。在特定日期
— TeamCity 在指定日期关闭调查或解除问题静音。 此条件对于您的团队无法立即解决的非关键问题非常有用,但您需要 CI 例程继续运行。
将设置复制到子子项目。 如果您编辑该项目及其子项目中存在的 investigation/mute,TeamCity 允许您选择是否将更新的设置传播到这些子项目。 否则,子项目的调查/静音将会有所不同(例如,分配给不同的用户)。
要在项目中管理和查看调查/静音,用户必须在此项目中被授予以下权限:
"Mute/unmute problems in project(在项目中静音/取消静音问题)":用于管理静音
"Assign/unassign investigation"(分配/取消分配调查):用于管理调查
“View project and all parent projects”(查看项目及所有父项目):用于查看现有的调查/禁音
这些权限默认授予项目管理员和系统管理员。
调查和静音不是特定于分支的。 如果问题被调查或被静音,则它在所有出现的分支中都被调查/被静音。 但是,TeamCity 会检查特定分支的构建以确定问题是否已解决。 这会影响到如何处理"Automatically when fixed"取消静音/关闭调查条件的问题。
如果在多个分支中发生故障,其中一个是默认分支,当故障在默认分支中消失时,问题被认为已修复。
如果故障仅发生在非默认活动分支中,当这些分支中的问题消失时,问题就被认为已解决。
不稳定测试是不稳定的测试,在构建运行之间看似没有差异的情况下可能成功完成或失败。 TeamCity 如果满足以下任意条件,则认为测试是不稳定的:
一次测试的翻转率很高。 翻转是指测试的状态从成功变为失败或相反情况的发生。 TeamCity 计算此类翻转与给定测试的总调用次数之比。 此比率按每个代理、每个构建配置或在特定时间段内(默认情况下为 7 天)进行测量。 一个始终失败或成功的测试,其翻转率接近于零。 每次调用都会"翻转"的测试翻转率接近 100%。
未更改底层代码的测试翻转。 如果测试以与处理同一修订版的前一次构建运行相反的状态完成(即没有处理新的更改),TeamCity 会认为该测试是不稳定的。
在一次构建中多次调用的测试以不同的状态结束。 此启发式方法支持 TestNG 单元测试,
调用次数
大于 1,以及由 .NET 运行器执行的测试, 测试重试次数 大于 0。note
TestNG 的参数化测试调用存在一个已知问题:TeamCity 依赖于 Surefire 和 Failsafe Maven 插件来进行测试结果报告,而这些插件在其 XML 输出中忽略了测试参数。 因此,同一构建中的参数化测试调用被错误地视为多个相同的测试调用,如果其中的一些调用失败,测试就会以 Flaky Failure 原因被标记为不稳定。 查看 相关问题。
如果出现以下情况,则测试不被认为是波动的:
相同 VCS 更改的不同配置的多个构建运行后,这些构建的测试结果有所不同。 这样的结果很可能是由环境问题引起的。
一个 VCS Root 配置了其 分支 ,并且一个测试在非默认分支中翻转。
TeamCity 在 测试 选项卡中显示不稳定测试,位于 构建结果页面...

...以及父项目的 不稳定的测试 页面上。

对于 JUnit 测试,可以一同使用第三方的 tempus-fugit 库和 JUnit。 仅需在测试中添加 @Intermittent
注解,并使用 IntermittentTestRunner
测试运行器,如下面的最小示例所示:
import org.junit.Test;
import org.junit.runner.RunWith;
import com.google.code.tempusfugit.concurrency.IntermittentTestRunner;
import com.google.code.tempusfugit.concurrency.annotations.Intermittent;
@RunWith(IntermittentTestRunner.class)
public class MultipleViaTempusFugit {
@Test
@Intermittent(repetition = 10)
public void test() {
// ...
}
}
如果这样的测试在单个构建中的多次调用中至少出现一次不稳定, Flaky Failure 启发式算法将会被触发。
与任何失败的测试一样,您可以为一个易变的测试(或多个测试)分配调查任务。 对于易出错的测试,解决方法会自动设置为 "手动";否则,一旦测试成功,调查将自动被移除,这并不意味着易出错的测试已经被修复。
tip
调查自动指派器可以 延迟自动分配调查 ,这可以防止在具有不稳定测试的项目中错误的自动分配。
Thanks for your feedback!