Visual studio 2010 如果AssemblyCleanup超时,如何导致测试运行错误?

Visual studio 2010 如果AssemblyCleanup超时,如何导致测试运行错误?,visual-studio-2010,mstest,Visual Studio 2010,Mstest,我在VisualStudio2010中使用MSTest,需要在所有测试运行后恢复数据库 我所做的是用属性装饰一个方法 <AssemblyCleanupAttribute()> Shared Sub AssemblyCleanup() ' Restore my databases which takes a long time... End Sub 共享子部件清理() '还原我的数据库需要很长时间。。。 端接头 问题是清理需要合理的时间,以至于达到超时 我开始意识到发生超

我在VisualStudio2010中使用MSTest,需要在所有测试运行后恢复数据库

我所做的是用属性装饰一个方法

<AssemblyCleanupAttribute()>
Shared Sub AssemblyCleanup()
    ' Restore my databases which takes a long time...
End Sub

共享子部件清理()
'还原我的数据库需要很长时间。。。
端接头
问题是清理需要合理的时间,以至于达到超时

我开始意识到发生超时的唯一原因是,在调试模式下,输出窗口报告“…QTAgent32.exe,AgentObject:Cleanup:清理代理时达到超时”。因此,它会非常安静地失败,如果MSTest报告测试运行错误,我会很高兴


检测和报告超时的最佳方法是什么?我的理想解决方案是将超时报告为测试运行错误。

为什么不将每个测试的内容包装在一个事务中,并在测试结束时回滚该事务?有关详细信息,请参见此处:

简言之,如果AssemblyCleanup超时,则不能导致MSTest报告错误

如果你遇到这个问题,那么在这一点上你需要考虑MSTEST的这个限制是否对你来说太大了。还有其他更好的测试框架


如果您决定坚持使用MSTest,并且只想确保AssemblyCleanup中的代码/脚本至少运行到完成,那么您可以选择将清理代码作为进程运行。这样即使AssemblyCleanup在内部调用Thread.Abort,您的进程也会运行到完成。虽然很混乱…

恢复数据库的目的不是恢复更改。我还原数据库,这样在运行测试后,我就剩下了一个包含大量数据的数据库,这意味着我可以使用它来继续手动测试,然后使用更真实的数据。因此,您使用相同的数据库实例进行手动测试和自动测试?没错。AssemblyCleanup将来可能会做其他任何事情,我只想确保超时发生时我知道它。@Vansly:那么为什么不使用单独的数据库实例进行测试呢?这样,您的手动数据就不会干扰测试数据。似乎自动恢复相互重叠的数据库是快速丢失大量数据的可靠方法。不幸的是,更改进程并不能解决MSTest在运行AssemblyCleanup时超时时不会报告测试运行失败的问题,恢复数据库或释放IO或非托管资源可能需要很长时间。但是,作为最后的手段,我必须:)到目前为止,我还没有找到检测超时的方法。可能对其他人有所帮助的一件事是,如果您将清理代码作为清理脚本运行(在.testrunconfig中进行配置,并将测试项目设置为控制台应用程序,并在主方法中调用AssemblyCleanup),那么至少超时不会导致数据库损坏。执行上述操作将启动一个不同的进程,因此无论测试运行是否因超时而完成,它都将一直运行到完成。