Запуск событий управления пользовательским интерфейсом из модульного теста

Как новичок в TDD, я пытаюсь написать тест, который предполагает, что значение свойства было изменено в PropertyGrid (C#, WinForms, .NET 3.5).

Изменение свойства объекта в сетке свойств не вызывает событие (достаточно справедливо, так как это событие, вызванное пользовательским интерфейсом, поэтому я понимаю, почему изменение принадлежащего объекта может быть невидимым для него).

У меня также была такая же проблема с запуском AfterSelect в TreeView при изменении свойства SelectedNode.

У меня могла бы быть функция, которую мой модульный тест может вызывать и которая имитирует код, который сработает событие пользовательского интерфейса, но это загромождает мой код, и если я не опубликую его, мне придется писать все свои тесты в одном проекте, или даже класса объектов, которые я тестирую (опять же, я вижу в этом беспорядок). Это кажется мне уродливым и будет страдать от проблем с ремонтопригодностью.

Существует ли соглашение о проведении такого модульного тестирования на основе пользовательского интерфейса?


person johnc    schedule 19.09.2008    source источник


Ответы (3)


Для модульного тестирования вашего кода вам нужно будет смоделировать объект элемента интерфейса пользовательского интерфейса. Есть много инструментов, которые вы можете использовать для этого, и я не могу рекомендовать что-то одно вместо другого. Хорошее сравнение MoQ и Rhino Mocks можно найти здесь по адресу Блог Фила Хаака, который показался мне полезным и может быть полезен вам.

Еще одна вещь, которую следует учитывать, если вы используете TDD, — это создание интерфейса для ваших представлений, который поможет в процессе TDD. Для этого существует модель проектирования (вероятно, более одной, но я использую именно эту) под названием Model View Presenter (теперь она разделена на Passive View и Supervisor Controller). Следование одному из них сделает ваш код гораздо более пригодным для тестирования в будущем.

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

person Odd    schedule 19.09.2008

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

Существует статья MSDN Использование Автоматизация пользовательского интерфейса для автоматизированного тестирования, которая является хорошей отправной точкой.

person Adrian Clark    schedule 19.09.2008

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

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

Мне будет интересно посмотреть, какие еще методы есть у людей для работы с такого рода проблемами.

person Justin Bozonier    schedule 19.09.2008