Как я могу модульно протестировать службу Windows?


.NET Framework: 2.0 Предпочтительный Язык: C#

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

во-первых, возможно ли вообще модульное тестирование службы Windows?

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

  1. OnStart
  2. OnStop

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

на данный момент, я даже делаю модульное тестирование? или интеграционный тест?

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

7 58

7 ответов:

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

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

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

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

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

Я бы начал здесь. Он показывает, как запускать и останавливать службы в 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
  {
    // ...
  }
}

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

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

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

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

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

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

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

парень, вероятно, лучший ответ.

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