我最终通过自定义 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 中读取测试程序集或字符串表资源上的自定义属性,并将信息添加到从测试结果解析/转换到自定义测试结果数据库和报告的数据中。