Как я могу модульно протестировать службу Windows?
.NET Framework: 2.0 Предпочтительный Язык: C#
Я новичок в TDD (Test Driven Development).
во-первых, возможно ли вообще модульное тестирование службы Windows?
класс службы Windows является производным от ServiceBase, который имеет переопределяемые методы,
- OnStart
- OnStop
Как я могу вызвать эти методы для вызова, как если бы модульный тест-это фактическая служба, которая вызывает эти методы в правильном порядок?
на данный момент, я даже делаю модульное тестирование? или интеграционный тест?
Я посмотрел на вопрос службы WCF, но это не имело никакого смысла для меня, так как я никогда не имел дело с сервисом WCF.
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[] {}});
обслуживание окна теста в автоматическом выключении, выключенных условиях Проверка оконной службы при отключении сети, подключении Тестовое окно сервисного варианта автозапуск, руководство и т. д
парень, вероятно, лучший ответ.
в любом случае, если вы действительно хотите, вы можете просто вызвать в модульном тесте эти два метода, как описано Примечание но, так как они защищены, вам нужно будет использовать отражение.