1

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

我想得到这样的视图,最好按解决方案(产品)和项目(.dll)分组,给业务人员。至少,我希望每个解决方案至少运行多个测试并失败。

有什么合适的方法可以用 TFS 做到这一点吗?

我到处找,不断撞墙,

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

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

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

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

2 回答 2

1

TRX 文件只是 XML,无需解析它们。您可以编写一个 XSLT 转换来以您需要的格式呈现数据。XSLT 的一个优点是它具有内置的聚合、分组、排序等功能。

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

准备工作将是一个相对简单的命令行工具,它将检查您的 sln 文件并构建解决方案所属项目的地图(搜索网络,我敢打赌已经有一堆脚本)。

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

我知道,这有点笼统,但希望它至少有所帮助。

于 2013-10-31T23:24:22.973 回答
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文件类似的方式将项目和解决方案信息添加到“注入”的字符串表资源中。

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

为了避免这一点,我还为我们团队的单元测试创​​建了一个自定义的 Visual Studio 项目模板,这样所有的东西都已经添加了,我的开发人员永远不必看到 MSBuild 项目的内部结构。

最难的部分是添加项目/解决方案信息。一旦我知道了,就很容易在本机 .dll 中读取测试程序集或字符串表资源上的自定义属性,并将信息添加到从测试结果解析/转换到自定义测试结果数据库和报告的数据中。

于 2015-05-26T13:00:44.303 回答