четверг, 15 ноября 2012 г.

Автоматизация установки и запуска служб 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));
                }
            }
        }

Комментариев нет:

Отправить комментарий