Visual Studio:执行批处理文件时测试ClassCleanup超​​时

时间:2009-11-04 04:56:48

标签: c# visual-studio unit-testing

我的目标是在使用ClassCleanup属性使用闪回恢复运行大量单元测试后,将Oracle数据库恢复到之前的状态。

我编写了一个批处理文件+ SQL来正确恢复数据库。这已在我的命令提示符中多次测试,没有问题

我通常将恢复作为清理脚本放在测试运行配置中,但是我需要包含一个时间来闪回数据库(在ClassInitialize上设置)

        try
        {
            ProcessStartInfo startInfo = new ProcessStartInfo(@"SomeProjectDirectory\flashback.bat");                
            startInfo.CreateNoWindow = false;                
            startInfo.WindowStyle = ProcessWindowStyle.Normal;
            startInfo.ErrorDialog = true;                
            startInfo.Arguments = Arguments;
            startInfo.UseShellExecute = true;                                                

            Process batchExecute = new Process();
            batchExecute.StartInfo = startInfo;
            batchExecute.Start();
            batchExecute.WaitForExit();
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine(e.ToString());
        }

批处理文件执行正常,但问题似乎是ClassCleanup方法在完成之前超时

在WaitForExit()之后,它没有遇到任何断点或捕获任何异常。它只是在进程中途退出命令提示符窗口,让我知道所有测试都成功,没有错误消息。

我尝试使用大量数字向ClassCleanup方法添加Timeout属性,但这似乎也没有帮助。我相当肯定的这个属性仅适用于单元测试而不是类清理

我将该过程移动到TestCleanup方法中,并且它没有问题。这个过程在测试中运行良好。它似乎只在ClassCleanup& AssemblyCleanup方法

我的印象是超时,因为每次我们运行测试时,它总是在同一点退出,但是如果我们在脚本中添加或删除步骤,它将会比正常更早或更晚退出

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。发生这种情况的原因是因为正在执行ClassCleanupAssemblyCleanup时正在后台进行的GC。因此,如果您尝试访问Cleanup函数范围之外的资源,则很可能会对它们进行垃圾回收,并且该函数将在不抛出异常的情况下退出。

您可以通过将所有必要的代码放入清理函数或在类的最开头制作它们的本地副本来解决问题(这有点像黑客攻击)。但是,对于客户端 - 服务器应用程序,这可能很棘手。您可能需要在此函数中引入一些低级代码才能使其正常工作。

就我个人而言,我并不理解这个设计决定,因为它让生活变得更加艰难。