Как я могу провести модульное тестирование службы Windows? - PullRequest
59 голосов
/ 03 сентября 2008

.NET Framework: 2.0 Предпочитаемый язык: C #

Я новичок в TDD (Test Driven Development).

Прежде всего, возможно ли провести модульное тестирование Windows Service?

Класс обслуживания Windows является производным от ServiceBase, который имеет переопределяемые методы,

  1. OnStart
  2. OnStop

Как я могу инициировать вызов этих методов, как если бы модульный тест представлял собой реальную службу, которая вызывает эти методы в правильном порядке?

В этот момент я даже провожу юнит-тестирование? или интеграционный тест?

Я смотрел на вопрос службы WCF, но для меня это не имело никакого смысла, поскольку я никогда не имел дело со службой WCF.

Ответы [ 7 ]

87 голосов
/ 03 сентября 2008

Вероятно, я бы порекомендовал разработать ваше приложение, чтобы «OnStart» и «OnStop» переопределяли в службе Windows, просто вызывая методы в сборке библиотеки классов. Таким образом, вы можете автоматизировать модульные тесты с использованием методов библиотеки классов, а дизайн также абстрагирует вашу бизнес-логику от реализации службы Windows.

В этом сценарии тестирование самих методов OnStart и OnStop в контексте службы Windows будет интеграционным тестом, а не чем-то, что вы автоматизируете.

31 голосов
/ 03 сентября 2008

У меня есть службы Windows с модульным тестированием, я не тестирую сервис напрямую, а проверяю, что делает сервис.

Обычно я создаю одну сборку для службы, а другую для того, что делает служба. Затем я пишу юнит-тесты против второй сборки.

Приятной особенностью этого подхода является то, что ваш сервис очень тонкий. По сути, все, что он делает - это вызывает методы, чтобы сделать правильную работу в нужное время. Ваша другая сборка содержит всю суть той работы, которую намеревается выполнить ваш сервис. Это позволяет очень легко тестировать и легко использовать или модифицировать по мере необходимости.

11 голосов
/ 03 сентября 2008

Я бы начал здесь . Он показывает, как запускать и останавливать службы в C #

Пример для запуска:

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

Я также тестировал сервисы в основном через консольное приложение, имитируя то, что сервис будет делать. Таким образом, мой модульный тест полностью автоматизирован.

5 голосов
/ 03 сентября 2008

Я бы использовал класс обслуживания Windows (тот, который вы запускаете, когда запускаете / останавливаете службу), вроде как прокси для вашей реальной системы. Я не понимаю, как код вашего сервиса должен отличаться от любого другого программирования. Методы onStart и onStop - это просто инициируемые события, например нажатие кнопки в графическом интерфейсе.

Итак, ваш класс обслуживания Windows - очень тонкий класс, сравнимый с формой Windows. Он вызывает вашу бизнес-логику / доменную логику, которая затем делает то, что должна делать. Все, что вам нужно сделать, - это убедиться, что методы, которые вы вызываете в onStart и onStop, работают так, как они должны. По крайней мере, это то, что я бы сделал; -)

3 голосов
/ 24 ноября 2015

Проектирование для тестирования - хорошая стратегия, так как многие ответы указывают на то, что ваши методы OnStart и OnStop остаются очень тонкими при делегировании объектам домена.

Однако, если ваши тесты по какой-то причине требуют выполнения сервисных методов, вы можете использовать такой код для вызова их из метода теста (в этом примере вызывается OnStart):

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});
0 голосов
/ 18 мая 2011

Гай, наверное, лучший ответ.

В любом случае, если вы действительно хотите, вы можете просто вызвать в модульном тесте эти два метода, как описано в документации MSDN , но, поскольку они защищены, вам нужно будет использовать Reflection.

0 голосов
/ 30 марта 2010

Test Window service в режиме автоматического выключения, выключения Проверка службы окна, когда сеть отключена, подключена Проверить окно службы автозапуска, ручной и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...