【问题标题】:Visual Studio: Test ClassCleanup Timeout When Executing A Batch FileVisual Studio:执行批处理文件时测试 ClassCleanup Timeout
【发布时间】:2009-11-04 04:56:47
【问题描述】:

我的目标是通过使用 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() 之后遇到任何断点或捕获任何异常。它只是在过程中途退出命令提示符窗口,并让我知道所有测试都成功,没有错误消息。

我尝试将 Timeout 属性添加到具有大量数字的 ClassCleanup 方法,但这似乎也无济于事。我相当肯定这个属性只适用于单元测试而不是类清理

我将该过程移到了 TestCleanup 方法中,它可以正常工作。该过程在测试中也运行良好。它似乎只在 ClassCleanup 和 AssemblyCleanup 方法中超时

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

【问题讨论】:

    标签: c# visual-studio unit-testing


    【解决方案1】:

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

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

    我个人不欣赏这个设计决定,因为它让生活变得比需要的更艰难。

    【讨论】:

    • 将 ProcessStartInfo 和 Process 设置为私有成员变量会阻止 GC 清理并且它运行良好。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多