Visual Studio: проверка времени ожидания ClassCleanup при выполнении командного файла

2

Моя цель - восстановить базу данных Oracle обратно в предыдущее состояние после того, как было проведено много модульных тестов, используя восстановление flashback с использованием атрибута ClassCleanup.

Я написал пакетный файл + SQL для правильного восстановления базы данных. Это было проверено в моей командной строке несколько раз без проблем.

Я бы обычно поместил восстановление как очистку script в конфигурацию тестового прогона, однако мне нужно включить время для восстановления базы данных (установить в 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 с большим числом, но это тоже не помогает. Этот признак, который я достаточно уверен, применим только к unit test не к очистке класса

Я перевел процесс в метод TestCleanup, и он работал без проблем. Процесс также прошел отлично внутри теста. Кажется, что тайм-аут в классах ClassCleanup и AssemblyCleanup

У меня создается впечатление, что это тайм-аут, потому что каждый раз, когда мы запускаем тест, он всегда выпадает в одной точке, однако если мы добавим или удалим шаги в script, он выпадет раньше или позже обычного

Теги:
visual-studio
unit-testing

1 ответ

2
Лучший ответ

У меня была такая же проблема. Причина этого в том, что GC, который происходит на заднем плане при выполнении ClassCleanup и AssemblyCleanup. Поэтому, если вы попытаетесь получить доступ к ресурсам за пределами области функции "Очистка", скорее всего, они будут собирать мусор, и функция перестанет исключать исключение.

Вы можете устранить проблему, поместив весь необходимый код в функции очистки или сделайте локальные копии их в самом начале класса (что немного взломает). Однако это может быть сложно с приложениями Client-Server. Возможно, вам понадобится ввести некоторый низкоуровневый код для этой функции, чтобы сделать эту работу.

Лично я не ценю это дизайнерское решение, потому что он делает жизнь намного сложнее, чем она должна быть.

  • 1
    Установка ProcessStartInfo & Process в качестве закрытых переменных-членов препятствовала очистке GC, и это работало отлично. большое спасибо
  • 0
    это здорово знать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню