【问题标题】:How can I set up code coverage threshold as a high water mark in TeamCity?如何在 TeamCity 中将代码覆盖率阈值设置为高水位线?
【发布时间】:2011-08-15 12:49:35
【问题描述】:

我有一个 TeamCity 构建,可以捕获单元测试的代码覆盖率。我还为构建成功的最小代码覆盖率定义了一个环境变量,它工作正常,但我不喜欢手动维护这个阈值。我的问题是是否有一种方法(除了在 TeamCity 之外的某个地方发布代码覆盖率统计数据,然后从上次成功构建中读取结果)随着代码覆盖率的提高而自动调整阈值,以确保它是一个稳定的改进而不允许倒退:)?

例如,假设当前代码覆盖率为 20%(遗留应用程序),并且随着新单元测试的编写,代码覆盖率提高到 25%。然后,有人在没有单元测试的情况下签入新代码,代码覆盖率下降到 24%。我希望 TeamCity 构建失败,因为代码覆盖率从 25% 下降到 24%。

【问题讨论】:

    标签: teamcity code-coverage teamcity-5.1


    【解决方案1】:

    我有一些关于代码覆盖率的宠物理论,我想先解释一下,然后再回答这个问题。

    首先是一些上下文:

    • Code coverage 有很多种,但我只讨论线路覆盖,但您应该可以替换为不同的类型。
    • 来自问题:“...有人在没有单元测试的情况下检查新代码并且代码覆盖率下降...”这与类似内容相关:“有人(重构/消除重复/替换算法并)删除测试代码和覆盖率下降。”
    • 应根据运行一套测试的结果来衡量覆盖率。也就是说,不是通过运行应用程序并从外部刺激它。
    • 以百分比表示的覆盖率非常具有误导性。
      我对此进行了思考,实际上您只想知道未涵盖多少行代码。
      请参阅我对此答案的评论:Ensure minimal coverage on new Subversion commits
    • 覆盖率应尽可能高。 该问题涉及“......在不允许倒退的情况下进行改进......”
    • 100% coverage is possible.
      我已经做到了,尽管有一个图书馆。

    我有一个theory,就代码覆盖率而言,您应该将代码分成两个部分:

    1. 100% 覆盖所有代码的部门。
    2. 不涉及任何代码的部门。

    任何一个部门都可以由多个项目组成,但部门的成员应该是文件(假设 Java 和 C# 都有源文件),最好是整个文件夹的文件。你可以在第一部门有一组项目,在第二部门有另一组。

    现在缺少覆盖的报告只是第二部分的行数。

    操作模式应该是您正在测试您的代码,并且代码只是属于 100% 覆盖范围。但是,如果您发现了一段您的大脑无法测试的棘手代码,您应该进行重构,以便将未测试的位移动到第二分区。或者,您可能会得到一个脑电波,并且能够找到一个将第二部分提高到 0% 以上的测试,此时您将代码重构到第一部分。这意味着每次签到都保持我的理论不变性。

    现在,回到问题:
    不,除了简要查看JetBrains 网站之外,我根本不了解 TeamCity,所以我不知道如何更新覆盖范围,但根据我的理论,它应该是 100% 或没有,你也可以每个项目设置限制?如果可以,那么 100% 的固定限制适用于第一个部门。
    如果您可以得到两个部门,您可能希望使用第二部门的代码行数来自动更新,逐渐降低更好。

    【讨论】:

    • +1 好答案 - 我自己也有类似的理论,而且我已经实现了我们代码库中许多库的 100% 覆盖率。
    【解决方案2】:

    运行测试后,查看覆盖率并将环境变量更新为最接近的五个不大于,也许?

    如果您的阈值最初是 25,而覆盖率跳到 31,请将其更新为 30,如果阈值低于 30,它将中断。当然,当发生跳跃时,您可以将其设为 31。

    那么在每次测试运行后,你看看当前覆盖率是否大于当前阈值并将阈值设置为新值?

    【讨论】:

    • 谢谢 - 这正是我目前正在做的,但这是一个手动过程,我想自动化它。
    • 我以为我说的是自动化的方法!在 teamcity 中,无论您的构建脚本是什么,在您运行测试之后,也会根据覆盖率值进行更新。如果你能给我更多关于你的构建脚本的细节,你如何调用 ncover 等等,我会告诉你确切的自动化方法!
    • 抱歉——我没有看到“自动”的含义:)。构建运行器是 MSBuild,导出代码覆盖率统计信息没有问题。阈值当前在 TeamCity 中设置为环境变量。感谢您的帮助!
    【解决方案3】:

    这是一个老问题,但我想提一下,现在可以通过“故障条件”功能在较新版本的 TeamCity 中实现这一点。故障条件可以使用常量,也可以与之前生成的指标进行比较。在这种情况下,失败条件如下所示:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2021-12-20
      • 2013-10-16
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多