При тестировании клиентской части клиент-серверных приложений мне приходилось сталкиваться с задачей автоматизации установки/удаления и запуска/остановки служб Windows, которые реализовывали серверную часть. Обычно при разворачивании и настройке приложения перед запуском всех тестов происходит установка служб, после запуска всех тестов - удаление служб (потому что мы должны привести систему в такое состояние, в котором она была до всех действий по запуску автоматизированных тестов). Также иногда в процессе выполнения тестов мне требовалось останавливать и запускать службы.
Для установки/удаления Windows-служб можно использовать следующий хелпер:
Для запуска/остановки Windows-служб можно использовать следующие методы:
Для установки/удаления Windows-служб можно использовать следующий хелпер:
private static void ManageInstallationService(string arguments, int timeout) { const string installUtilPath = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe"; Process p = null; try { p = Process.Start(installUtilPath, arguments); p.WaitForExit(timeout); if (!p.HasExited) { throw new TestExecutionException(String.Format(CultureInfo.InvariantCulture, "Процесс установки/удаления сервиса {0} не завершился за установленный таймаут {1} мс.", arguments, timeout)); } } finally { if (p != null && !p.HasExited) { p.Kill(); } } }
где arguments - абсолютный путь к устанавливаемой службе.
Для запуска/остановки Windows-служб можно использовать следующие методы:
public static void StartService(string serviceName, int timeout) { var service = new ServiceController(serviceName); if (service.Status != ServiceControllerStatus.Running) { try { var timeSpan = TimeSpan.FromMilliseconds(timeout); service.Refresh(); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeSpan); } catch (System.ComponentModel.Win32Exception ex) { throw new TestExecutionException(String.Format(CultureInfo.InvariantCulture, "Не получилось запустить сервис «{0}».\n{1}\nService status {2}", service.DisplayName, ex.Message, service.Status)); } catch (System.ServiceProcess.TimeoutException ex) { throw new TestExecutionException(String.Format(CultureInfo.InvariantCulture, "Не получилось запустить сервис «{0}».\n{1}\nService status {2}", service.DisplayName, ex.Message, service.Status)); } } }
public static void StopService(string serviceName, int timeout) { var service = new ServiceController(serviceName); if (service.Status != ServiceControllerStatus.Stopped) { try { var timeSpan = TimeSpan.FromMilliseconds(timeout); service.Refresh(); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeSpan); } catch (System.ComponentModel.Win32Exception ex) { throw new TestExecutionException(String.Format(CultureInfo.InvariantCulture, "Не получилось остановить сервис «{0}».\n{1}\nService status {2}", service.DisplayName, ex.Message, service.Status)); } catch (System.ServiceProcess.TimeoutException ex) { throw new TestExecutionException(String.Format(CultureInfo.InvariantCulture, "Не получилось остановить сервис «{0}В».\n{1}\nService status {2}", service.DisplayName, ex.Message, service.Status)); } } }
Комментариев нет:
Отправить комментарий