如何将需直接引用的测试包归集到通用测试工具包以支持VS测试检测?
解决方法:将测试依赖归集到通用工具包的实现方案
核心思路就是用MSBuild的.props和.targets文件统一注入依赖,完全符合vstest评论提到的方案,既能实现DRY原则,又能满足Visual Studio测试运行器对Microsoft.NET.Test.Sdk的直接引用要求。
1. 为通用测试工具包创建MSBuild配置文件
在你的通用测试工具包项目中,新建build目录,添加两个文件:
Your.Test.Toolkit.props:用来统一定义所有测试依赖的包引用Your.Test.Toolkit.targets:(可选)用于添加额外构建逻辑
在.props文件中按如下配置,处理Microsoft.NET.Test.Sdk的特殊要求,同时配置PrivateAssets和IncludeAssets避免依赖传递:
<Project> <ItemGroup> <!-- 注入Microsoft.NET.Test.Sdk,等同于项目直接引用,满足测试运行器检测要求 --> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <!-- 其他第三方测试组件,统一归集到这里 --> <PackageReference Include="xunit" Version="2.6.6"> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="xunit.runner.visualstudio" Version="2.5.3"> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="coverlet.collector" Version="6.0.0"> <PrivateAssets>all</PrivateAssets> </PackageReference> </ItemGroup> </Project>
2. 配置通用工具包的NuGet打包规则
在通用工具包的.csproj中,确保build目录下的配置文件被打包到NuGet中:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <PackageId>Your.Test.Toolkit</PackageId> <Version>1.0.0</Version> <IncludeBuildOutput>false</IncludeBuildOutput> </PropertyGroup> <ItemGroup> <None Include="build\**" Pack="true" PackagePath="build" /> </ItemGroup> </Project>
3. 测试项目仅需引用通用工具包
所有测试项目无需再单独添加Microsoft.NET.Test.Sdk或其他测试组件的引用,只需要添加通用工具包的引用即可:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <IsPackable>false</IsPackable> </PropertyGroup> <ItemGroup> <PackageReference Include="Your.Test.Toolkit" Version="1.0.0" /> </ItemGroup> </Project>
方案原理说明
- Visual Studio测试运行器会识别通过MSBuild props注入的
Microsoft.NET.Test.Sdk引用,因为props文件会在项目加载阶段被自动导入,效果等同于项目直接声明该引用。 PrivateAssets="all"配置确保这些依赖不会传递到引用测试项目的其他项目中,和直接在测试项目中设置的效果完全一致。- 所有测试项目仅需维护通用工具包的引用,后续更新依赖版本或新增组件,只需修改通用工具包的props文件即可,完全符合DRY原则。
内容的提问来源于stack exchange,提问作者Grastveit
相关产品推荐
相关产品推荐

