Continuous integration 是否应该在每次构建时执行代码覆盖率?

Continuous integration 是否应该在每次构建时执行代码覆盖率?,continuous-integration,teamcity,code-analysis,code-metrics,ncover,Continuous Integration,Teamcity,Code Analysis,Code Metrics,Ncover,我是棕地应用程序开发的超级粉丝。毫无疑问,这是一本很棒的书,我推荐给所有的开发者。我在这里是因为我在书中谈到了代码覆盖率的要点。在我的新店,我们使用TeamCity进行自动构建/持续集成,构建完成大约需要40分钟。《棕色地带》一书讲述了无摩擦开发,以及我们希望如何减轻开发人员必须承受的共同负担。这是我在130页上读到的 “代码覆盖率:以一个流程的价格实现两个流程? 如清单5.2中的示例目标所示,您最终得到两个输出文件: 一个是测试结果,另一个是代码覆盖率结果 实际上,您正在执行此任务期间的测试

我是棕地应用程序开发的超级粉丝。毫无疑问,这是一本很棒的书,我推荐给所有的开发者。我在这里是因为我在书中谈到了代码覆盖率的要点。在我的新店,我们使用TeamCity进行自动构建/持续集成,构建完成大约需要40分钟。《棕色地带》一书讲述了无摩擦开发,以及我们希望如何减轻开发人员必须承受的共同负担。这是我在130页上读到的

“代码覆盖率:以一个流程的价格实现两个流程? 如清单5.2中的示例目标所示,您最终得到两个输出文件: 一个是测试结果,另一个是代码覆盖率结果 实际上,您正在执行此任务期间的测试

如果您正在运行,从技术上讲,您不需要在单独的任务中执行测试 代码覆盖任务。出于这个原因,许多团队将替换自动 测试任务的代码覆盖率任务,基本上在 CI进程。CI服务器将编译代码、测试代码并生成代码覆盖率 每次入住的统计数据

尽管这种方法在概念上没有什么错误,但要注意一些 缺点。首先,生成代码覆盖率统计数据会带来开销。当 有很多测试,这项开销可能会严重到足以在测试中引起摩擦 运行时间较长的自动生成脚本的形式。请记住,主生成 脚本应该尽可能快地运行,以鼓励团队成员经常运行它。如果 运行时间太长,您可能会发现开发人员正在寻找解决方法

出于这些原因,我们建议分别执行代码覆盖率任务和 构建脚本的默认任务。它应该定期运行,可能作为构建文件中一个单独的计划任务,每两周甚至每月执行一次,但是我们 不要觉得度量有足够的好处来保证额外的开销 它在每次办理登机手续时都会执行。”


这与我目前所在的商店的做法相反,我们在每次构建时都执行NCover。我想走到我的前面,要求我们不要这样做,但我能做的就是告诉他“这是棕色地带的书上说的”。我觉得这还不够好。所以我相信你们会在这个话题上给我提供你们的个人经验和建议。谢谢。

关于如何解决这个问题,我不会做任何假设——你在这里有点本末倒置。您抱怨构建时间太长,所以这是我要求解决的问题,没有关于如何实现的先入为主的想法。这个问题还有很多其他的潜在解决方案(更快的机器、不同的流程等),您最好不要排除其中任何一个


归根结底,这是一个管理层是否重视构建系统的输出以证明所需时间的问题。(以及您可能采取的任何补救时间消耗的措施是否具有可接受的输出保真度)。

这是每个团队和每个环境的决策。您应该首先确定构建持续时间的阈值,然后在确定之后,将运行时间较长的流程分解为发生频率较低的流程(理想情况下,在CI中一天不少于1或2次)。

问题似乎是执行所有测试和收集代码覆盖率的成本较高,而您没有这样做(好吧,有人不想)为每一次构建都付出这样的代价

我无法想象为什么你(或某人)不想总是知道保险范围的状况

如果构建机器没有其他事情要做,那么它是否也这样做也没关系。 如果您的构建机器太忙于构建,可能是您要求它为太多的主控服务器提供服务而导致其过载,或者您正在进行太多的构建(为什么要进行这么多更改?嗯,可能测试不是很好!)

如果问题是测试本身确实需要很长时间,您可能会找到一种优化测试的方法。特别是,您不需要为未更改的代码部分重新运行测试。弄清楚如何执行(并相信它)可能是一个挑战

一些测试覆盖率工具(例如)使您能够跟踪哪些测试覆盖了代码的哪一部分,以及在给定代码更改的情况下,哪些测试需要重新运行。通过一些额外的脚本,您可以简单地重新运行首先受影响的测试;这使您能够在不运行所有测试的情况下尽早/快速获得完整的测试结果。然后,如果生成有问题,则你要尽快找到答案


[如果您有妄想症,并且不真正信任增量测试过程,您可以运行它们以获得早期反馈,然后继续再次运行所有测试,为您提供完整的结果。]

在持续集成/自动构建系统中,始终存在两个相互竞争的利益:

  • 您希望构建尽快运行
  • 您希望构建运行时有尽可能多的反馈(例如,运行的测试数量最多,关于构建稳定性和覆盖率的可用信息量最多,等等)
  • <>你总是需要权衡一下,在这些竞争的利益之间找到平衡点。我通常试图把我的构建时间保持在10分钟以内,如果需要花费超过20分钟的时间来给出关于构建的稳定性的任何有意义的反馈,就会考虑构建系统被破坏。但是这不需要是一个完整的构建。每种情况下都会进行EST;可能会有其他测试稍后运行或在其他机器上并行运行,以进一步测试系统

    如果您看到构建时间为40分钟,我建议您尽快执行以下操作之一:

    • 将构建/测试分发到多台机器上,以便测试可以并行运行,并且您可以获得更快的反馈