gpt4 book ai didi

continuous-integration - 如果代码覆盖率低于 TFS2012 中的阈值,则构建失败

转载 作者:行者123 更新时间:2023-12-04 02:13:05 25 4
gpt4 key购买 nike

当代码覆盖率低于阈值时,我试图在 TFS 服务(托管 TFS2012)中构建失败。

我一直在处理 http://scrumdod.blogspot.co.uk/2011/04/fail-build-if-code-coverage-is-low.html 的解决方案

但是,我使用的是 TFS2012,很多事情似乎都发生了变化。特别是,测试运行的配置完全不同,似乎没有任何方法可以在构建过程模板或 .runsettings 文件中获取或设置 .coverage 文件的位置和名称。

我将如何在 TFS2012 或 TFSService 中查找(或设置).coverage 文件的位置?

或者,如果代码覆盖率低于阈值,是否还有另一种方法可以使构建失败?

最佳答案

这将需要几个步骤:

  • 创建自定义构建事件
  • 将事件添加到构建 Controller
  • 在新的构建过程中调用该自定义构建事件
  • 使用新的构建过程

  • 1. 创建自定义构建事件。

    在 VS2012 中新建一个项目(我叫我的 CodeCoverageLibrary。引用以下程序集:
  • Microsoft.TeamFoundation.Build.Client
  • Microsoft.TeamFoundation.Client
  • Microsoft.TeamFoundation.TestManagement.Client
  • Microsoft.TeamFoundation.WorkItemTracking.Client
  • 系统
  • 系统事件
  • System.Core
  • System.Xaml

  • 您可以使用以下代码:
    using System;
    using System.Activities;
    using System.Collections.Generic;
    using Microsoft.TeamFoundation.Build.Client;
    using Microsoft.TeamFoundation.Client;
    using Microsoft.TeamFoundation.TestManagement.Client;

    namespace CodeCoverageLibrary
    {
    [BuildActivity(HostEnvironmentOption.All)]
    public sealed class GetCodeCoverage : CodeActivity<double>
    {
    public InArgument<IBuildDetail> BuildDetail { get; set; }

    protected override double Execute(CodeActivityContext context)
    {
    var buildDetail = BuildDetail.Get(context);
    var buildCoverages = GetBuildCoverages(buildDetail.BuildServer.TeamProjectCollection.Uri,
    buildDetail.TeamProject, buildDetail.Uri);
    return GetTotalCoverage(buildCoverages);
    }

    private static IEnumerable<IBuildCoverage> GetBuildCoverages(Uri uri, string projectName, Uri buildUri)
    {
    return TfsTeamProjectCollectionFactory.GetTeamProjectCollection(uri)
    .GetService<ITestManagementService>()
    .GetTeamProject(projectName)
    .CoverageAnalysisManager.QueryBuildCoverage(buildUri.ToString(),
    CoverageQueryFlags.Modules);
    }

    private static double GetTotalCoverage(IEnumerable<IBuildCoverage> buildCoverages)
    {
    int totalCoveredBlocks = 0, totalUncoveredBlocks = 0;
    foreach (var buildCoverage in buildCoverages)
    {
    foreach (var module in buildCoverage.Modules)
    {
    totalCoveredBlocks += module.Statistics.BlocksCovered;
    totalUncoveredBlocks += module.Statistics.BlocksNotCovered;
    }
    }

    return (totalCoveredBlocks == 0 && totalUncoveredBlocks == 0)
    ? 0.0
    : ((double) totalCoveredBlocks) /
    ((double) (totalCoveredBlocks + totalUncoveredBlocks));
    }
    }
    }

    编译项目并添加到 TFS 上的版本控制路径。

    2. 将事件添加到构建 Controller

    在团队资源管理器中,转到 构建 > 行动 > 管理构建 Controller ... .然后点击 属性... 对于构建 Controller 。下 自定义程序集的版本控制路径 ,把你上面用的路径。

    3. 在构建过程中调用该自定义构建事件

    复制 BuildProcessTemplates\DefaultTemplate.11.1.xaml 到一个新文件。

    更新新 XAML 文件的开头以包含以下内容:
    <Activity ...
    xmlns:ccl="clr-namespace:CodeCoverageLibrary;assembly=CodeCoverageLibrary"
    ...
    >
    <x:Members>
    ...
    <x:Property Name="CodeCoverageTolerance" Type="InArgument(x:Double)" />
    </x:Members>
    ...
    <this:Process.Metadata>
    <mtbw:ProcessParameterMetadataCollection>
    ...
    <mtbw:ProcessParameterMetadata BrowsableWhen="EditingDefinition" Category="#900 Misc" DisplayName="CodeCoverageTolerance" Description="If the overall code coverage drops below this threshold, then the build will fail. This is a number between 0 and 1." ParameterName="CodeCoverageTolerance" />
    </mtbw:ProcessParameterMetadataCollection>
    </this:Process.Metadata>

    更新 XAML 文件的末尾以包含以下内容:
          <Sequence DisplayName="Code Coverage Check" mtbwt:BuildTrackingParticipant.Importance="None">
    <Sequence.Variables>
    <Variable x:TypeArguments="x:Double" Name="CodeCovered" />
    </Sequence.Variables>
    <ccl:GetCodeCoverage DisplayName="Getting Code Coverage" BuildDetail="[BuildDetail]" Result="[CodeCovered]" />
    <If Condition="[CodeCovered &lt; CodeCoverageTolerance]">
    <If.Then>
    <Sequence DisplayName="Comparing Code Coverage Against Tolerance">
    <mtbwa:SetBuildProperties DisplayName="Set TestStatus to Failed" mtbwt:BuildTrackingParticipant.Importance="Low" PropertiesToSet="TestStatus" TestStatus="[Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Failed]" />
    <mtbwa:WriteBuildError Message="[&quot;Code Coverage of &quot; + CodeCovered.ToString(&quot;P&quot;) + &quot; is less than required &quot; + CodeCoverageTolerance.ToString(&quot;P&quot;)]" />
    </Sequence>
    </If.Then>
    </If>
    </Sequence>
    </mtbwa:AgentScope>
    <mtbwa:InvokeForReason DisplayName="Check In Gated Changes for CheckInShelveset Builds" Reason="CheckInShelveset">
    <mtbwa:CheckInGatedChanges DisplayName="Check In Gated Changes" />
    </mtbwa:InvokeForReason>
    </Sequence>
    </Activity>

    将此检查到 TFS。

    4.使用新的构建过程

    在团队资源管理器中,转到 构建 并右键单击您的构建定义。转至 编辑构建定义... > 进程 .展开 构建流程模板然后点击 新... .点击 选择现有的 XAML 文件 并将路径放在新的 XAML 文件中。点击 好的 .您现在应该看到 CodeCoverageTolerance 4. 其他 .您可以输入一个介于 0 和 1 之间的数字来表示所需的百分比。

    关于continuous-integration - 如果代码覆盖率低于 TFS2012 中的阈值,则构建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282652/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com