Как я могу unit test обслуживать Windows?

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

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

Во-первых, возможно ли даже unit test Служба Windows?

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

  • OnStart
  • OnStop

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

На этом этапе я даже тестирую Unit? или тест интеграции?

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Образец для запуска -

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
  {
    // ...
  }
}

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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