是否有可能获得在TFS构建中运行的单元测试报告,按解决方案分组?

时间:2013-10-24 18:30:13

标签: unit-testing visual-studio-2012 tfs2012 vs-unit-testing-framework

我们有几千个本机和.NET单元测试。在Visual Studio 2012中,我可以运行并查看按C ++ / C#项目分组的结果。

我希望得到类似这样的观点,最好按解决方案(产品)分组,然后将项目(.dll)分组给业务人员。至少我希望至少有一些测试运行并且每个解决方案都失败了。

TFS有没有正确的方法呢?

我到处寻找并继续撞墙,

  • TFS构建测试结果似乎并未存储有关测试类别的任何信息,因此我无法使用这些信息按解决方案进行分组

  • .vsmdi列表和.testsettings文件已在VS 2012和TFS 2012中逐步淘汰。我们在每个解决方案之前都有单独的列表...现在它只是* test * .dll

  • 对于这么多粒度的测试结果,测试计划和自定义SSRS报告似乎完全没用(为什么?)。 TfsTestWarehouse几乎没有任何东西 - 足以满足每次构建通过/失败的总测试。

  • 使用像trx2html这样的工具解析TRX文件和编写HTML报告似乎效果最好,但我仍然无法通过解决方案运行测试。

2 个答案:

答案 0 :(得分:1)

TRX文件只是XML,不需要解析它们。您可以编写XSLT转换以您需要的格式显示数据。 XSLT的一个好处是它具有内置的聚合,分组,排序等功能。

如果TRX文件本身不包含解决方案信息(很可能),那么您将需要生成两阶段报告:准备数据,生成报告。

准备将是一个相对简单的命令行工具,它将覆盖你的sln文件,并构建一个项目所属的项目的地图(搜索网络,我打赌已经有一堆脚本)

生成部分将使用该映射作为转换和报告生成的参数,以正确地聚合数据。

我知道,这是一个通用的回应,但希望它至少有一点帮助。

答案 1 :(得分:0)

我最终通过在构建时通过自定义MSBuild任务在自定义程序集属性(即测试.dll)中添加项目和解决方案信息来解决此问题。这大致是我遵循的步骤(从记忆中)。

首先,我创建了自定义属性:

[AttributeUsage(AttributeTargets.Assembly)]
public class ProjectAttribute: Attribute {
    public string Project { get; set; }
    public string Solution { get; set; }
    public ProjectAttribute(string project, string solution)
    {
        this.Project = project;
        this.Solution = solution;
    }
}

此自定义属性是在所有单元测试项目引用的程序集中定义的。

然后我创建了一个非常简单/基本的内联MSBuild任务,CreateProjectAttribCs,它将动态创建一行额外的C#文件。类似的东西:

[assembly: ProjectAttribute(Project="$(ProjectName)") Solution="$(Solution)"]

然后我将此文件添加到<Compile>项目组中,在编译之前调用的自定义MSBuild目标内部(再次,从内存中调用):

<Target Name="CreateProjectAttribCs" BeforeTargets="Compile">
    <CreateProjectAttribCs File="ProjectAttribute.cs" />
    <ItemGroup>
        <Compile Include="ProjectAttribute.cs" />
    </ItemGroup>
</Target>
<Target Name="CleanupProjectAttribCs" AfterTargets="Compile>
    <Delete Files="ProjectAttribute.cs" />
</Target>

对于C ++项目,我以与ProjectAttrib.cs文件类似的方式将项目和解决方案信息添加到“注入”字符串表资源。

所有这一切的一个主要烦恼是,开发人员必须通过编辑.csproj或.vcxproj来添加此自定义MSBuild .targets文件(包含自定义目标和程序集引用)。

为了避免这种情况,我还为我们团队的单元测试创​​建了一个自定义的Visual Studio项目模板,以便所有内容都已添加,我的开发人员将永远不会看到MSBuild项目的内部。

最难的部分是添加项目/解决方案信息。一旦我有了这个,就可以很容易地读取测试程序集中的自定义属性或原生.dll中的String Table资源,并将信息添加到从测试结果解析/转换的数据到自定义测试结果数据库和报告。