在异步单元测试中调用 Assert.Inconclusive() 被报告为失败
Calling Assert.Inconclusive() in an async unit test is reported as a fail
我有一系列连接到 Azure 存储模拟器的单元测试。在设置中,我的代码检查是否有东西在模拟器的端口上侦听,如果没有则设置标志 StorageNotAvailable
.
在我的每个测试中,我都有一些代码...
if ( StorageNotAvailable )
Assert.Inconclusive( "Storage emulator is not available" )
// where storage emulator is available, continue as normal
正如预期的那样,当测试 returns void
时,它在测试资源管理器中正确报告为 "Inconclusive"。
当测试执行一些异步方法时,[TestMethod]
签名 returns Task
然后测试在 TestExplorer 中报告为 "Failed" 而不是 "Inconclusive".
如何让异步方法报告为不确定?
编辑
可能需要一些额外的细节。下面是一些我用来演示我遇到的问题的示例测试。
[TestMethod]
public void MyTestMethod()
{
Assert.Inconclusive( "I am inconclusive" );
}
[TestMethod]
public async Task MyTestMethodAsync()
{
Assert.Inconclusive( "I am an error" );
}
一些环境细节也可能是有序的:
- Windows 10 x64 1703 内部版本 15063.608
- Visual Studio 企业版 2017 15.3.5
- .NET 4.7.02046
- 可能相关的 VS 扩展
- 微软Visual Studio测试平台
- MSTest V2 创建单元测试扩展
- MSTest V2 IntelliTest 扩展
- MSTest V2 模板
- 可能相关的项目参考
- Microsoft.VisualStudio.TestPlatform.TestFramework v14.0.0.0
- Microsoft.VisualStudio.TestPlatform.TestFramework.扩展 v14.0.0.0
- 可能相关的项目 nuGet 包
- MSTest.TestAdapter v1.1.18
- MSTest.TestFramework v1.1.18
- 项目构建目标是 .NET Framework v4.7
Assert.Inconclusive
raises a special kind of exception,这将导致任务捕获该异常。由于 Task 库和 async 不知道,我们不能怪他们抱怨。 Task 框架会将异常包装在 AggregateException 中,我怀疑它正在被报告。这是一个很好的假设,但事实证明寻找 AssetInconclusiveException 的代码正在将引发的实例与 MstestV1 的实现而不是 MsTestV2 进行比较。
但我想这应该被认为是 MsTest v2 运行器中的一个错误,它应该检查所有失败的任务并查看导致它们失败的异常。
该行为目前是已知行为,I've just submitted a PR to fix this。合并请求,现在只需等待下一个 Nuget 构建触发。
此修复已合并并在 latest 1.2.0 package 中发布。
这是由 MsTest.Framework 代码中已确认的错误引起的 -- GitHub 上的问题 #249 正在跟踪问题和最终解决方案:
使用 Assert.Inconclusive 的异步测试报告为错误
我有一系列连接到 Azure 存储模拟器的单元测试。在设置中,我的代码检查是否有东西在模拟器的端口上侦听,如果没有则设置标志 StorageNotAvailable
.
在我的每个测试中,我都有一些代码...
if ( StorageNotAvailable )
Assert.Inconclusive( "Storage emulator is not available" )
// where storage emulator is available, continue as normal
正如预期的那样,当测试 returns void
时,它在测试资源管理器中正确报告为 "Inconclusive"。
当测试执行一些异步方法时,[TestMethod]
签名 returns Task
然后测试在 TestExplorer 中报告为 "Failed" 而不是 "Inconclusive".
如何让异步方法报告为不确定?
编辑
可能需要一些额外的细节。下面是一些我用来演示我遇到的问题的示例测试。
[TestMethod]
public void MyTestMethod()
{
Assert.Inconclusive( "I am inconclusive" );
}
[TestMethod]
public async Task MyTestMethodAsync()
{
Assert.Inconclusive( "I am an error" );
}
一些环境细节也可能是有序的:
- Windows 10 x64 1703 内部版本 15063.608
- Visual Studio 企业版 2017 15.3.5
- .NET 4.7.02046
- 可能相关的 VS 扩展
- 微软Visual Studio测试平台
- MSTest V2 创建单元测试扩展
- MSTest V2 IntelliTest 扩展
- MSTest V2 模板
- 可能相关的项目参考
- Microsoft.VisualStudio.TestPlatform.TestFramework v14.0.0.0
- Microsoft.VisualStudio.TestPlatform.TestFramework.扩展 v14.0.0.0
- 可能相关的项目 nuGet 包
- MSTest.TestAdapter v1.1.18
- MSTest.TestFramework v1.1.18
- 项目构建目标是 .NET Framework v4.7
Assert.Inconclusive
raises a special kind of exception,这将导致任务捕获该异常。由于 Task 库和 async 不知道,我们不能怪他们抱怨。 Task 框架会将异常包装在 AggregateException 中,我怀疑它正在被报告。这是一个很好的假设,但事实证明寻找 AssetInconclusiveException 的代码正在将引发的实例与 MstestV1 的实现而不是 MsTestV2 进行比较。
但我想这应该被认为是 MsTest v2 运行器中的一个错误,它应该检查所有失败的任务并查看导致它们失败的异常。
该行为目前是已知行为,I've just submitted a PR to fix this。合并请求,现在只需等待下一个 Nuget 构建触发。
此修复已合并并在 latest 1.2.0 package 中发布。
这是由 MsTest.Framework 代码中已确认的错误引起的 -- GitHub 上的问题 #249 正在跟踪问题和最终解决方案:
使用 Assert.Inconclusive 的异步测试报告为错误