Моя цель - восстановить базу данных 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, он выпадет раньше или позже обычного
У меня была такая же проблема. Причина этого в том, что GC, который происходит на заднем плане при выполнении ClassCleanup
и AssemblyCleanup
. Поэтому, если вы попытаетесь получить доступ к ресурсам за пределами области функции "Очистка", скорее всего, они будут собирать мусор, и функция перестанет исключать исключение.
Вы можете устранить проблему, поместив весь необходимый код в функции очистки или сделайте локальные копии их в самом начале класса (что немного взломает). Однако это может быть сложно с приложениями Client-Server. Возможно, вам понадобится ввести некоторый низкоуровневый код для этой функции, чтобы сделать эту работу.
Лично я не ценю это дизайнерское решение, потому что он делает жизнь намного сложнее, чем она должна быть.