我们有 MSTest 测试,可以在每小时的生产中自动运行。 其中一项测试标有
[Ignore]
属性,因为它尚未准备好在我们的生产环境中运行。我目前通过注释掉
[Ignore]
行来修复它。但现在我需要注意在签入代码之前删除注释字符 (//
)。
还有其他方法可以临时运行
[Ignore]
测试吗?
最近,当我遇到此类问题时,我向 Visual Studio 项目中添加了一个新的 Build Configuration,命名为“Local Developer Debug”,并使用现有调试配置中的设置。然后我转到“项目 - > MyProjectName Properties - > Build”,确保“本地开发人员调试”是选定的配置,并将“LOCALDEVBUILD”添加到“条件编译符号”。这允许使用预处理器指令在编译时“切换”代码:
#if (!LOCALDEVBUILD)
[Ignore]
#endif
不确定这是否是您正在寻找的...但它允许您根据构建的意图运行/利用特定代码(通过构建配置)...使用此方法,您可以忽略测试对于更多“官方”构建,但如果您愿意,仍然可以在闲暇时执行它。
您还可以使用测试类别来标记您不想包含在自动化测试中的测试方法,例如
[TestCategory("IgnoreOnBuild")]
因此不使用
[Ignore]
属性。并将其与构建定义中的过滤器结合起来,位于 Basic -> Automated Test -> Test Source -> Test Case Filter 下:
TestCategory!=IgnoreOnBuild
看起来还有其他方法可以使用 testrunconfig 文件启用/禁用测试。但是,如果您使用 IgnoreAttribute,它会与代码一起编译,因此无法轻松切换。
来自文档:
单元测试的 Ignore 属性与测试的其他属性和源代码一起驻留在单元测试的源文件中。这意味着,如果您在“测试管理器”窗口中禁用单元测试,然后使用 MSTest.exe 命令行实用程序运行该测试,该测试仍会运行。但是,如果使用 Ignore 属性标记单元测试,编译程序集,然后使用 MSTest.exe 运行测试,则测试不会运行。它不会运行,因为忽略属性已成为测试的一部分。
正如@Lasse提到的,可以设置
[TestCategory("DockerEnvironmentRequired")]
。除此之外,您可以在本地 .runsettings 中设置一个过滤器,其中包含或排除具有指定 TestCategory 的测试。
测试示例:
[TestClass]
[TestCategory("DockerEnvironmentRequired")]
public class MyTests
{
[TestMethod]
public async Task XXX_ShouldSuccess()
{
...
}
}
示例外部构建环境.runsettings:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<TestRunParameters>
...
</TestRunParameters>
<RunConfiguration>
<TestCaseFilter>TestCategory!=DockerEnvironmentRequired</TestCaseFilter>
</RunConfiguration>
</RunSettings>
在本地,您可以删除 .runsettings 中的 TestCaseFilter 节点来运行它们。
使用 CLI 的替代方案: dotnet test --filter TestCategory!=DockerEnvironmentRequired
我还有另一种方法。这会自动删除开发者端的 [Ignore] 属性。
Directory.Build.targets
添加到根测试文件夹<Project>
<PropertyGroup Condition="'$(CI)' == 'true'">
<DefineConstants>$(DefineConstants);CONTINUOUS_INTEGRATION_BUILD</DefineConstants>
</PropertyGroup>
</Project>
#if CONTINUOUS_INTEGRATION_BUILD
[Ignore]
#endif
您还可以在此处检查可能的 CI 环境变量:https://github.com/dotnet/reproducible-builds/blob/f41ae4c0a4400acce7797691d69134f2562b26b0/src/DotNet.ReproducibleBuilds/DotNet.ReproducibleBuilds.props#L32