Я полюбил юнит-тесты. Они мои друзья. Они вселяют в меня спокойствие и уверенность в своих действиях, всякий раз когда я принимаюсь за рефакторинг кода. Но есть код, который, как ни старайся, силами "настоящих" (о "настоящих" юнит-тестах как-нибудь в другой раз) юнит-тестов не покроешь - UI код. Да, где то ближе к вершине "пирамиды" тестов (еще одна тема для маленького поста), построенной на прочном фундаменте юнит-тестов, будут End-To-End тесты, User Acceptance тесты и т.д. Но мне хочется иметь быстрое и простое как в написании, так и в поддержке, средство, которое позволит мне тестировать отдельные формы. В конце концов формы - это то, с чем работает пользователь, то что для него и ассоциируется с программой.
Для первого примера возьмем простейшую форму с тремя кнопками и одним полем ввода:
Нажатие на кнопку должно приводить к появлению ее названия в поле ввода. Однако в код вкралась ошибка - нажатие на button3 обрабатывается тем же обработчиком, что и для button1. Обычная ошибка в wiring code. Однако юнит-тестами, даже если бы они тут были, такую ошибку не обнаружить. Посмотрим как нам в этом может помочь White.
Сразу хочу обговорить некоторые важные моменты:
- Я старался добиться максимально простого кода настройки "окружения" теста. Простота написания теста - меньше причин его не писать.
- Исходя из вышесказанного я принял за аксиому следующее: один тест-класс тестирует одну форму. Здесь не было никаких технических проблем дать возможность указать для каждого тестового метода какую форму он будет тестировать, но это заметно усложняет настройку "окружения".
- "Пирамида" тестирования строится снизу вверх. Ничто не заменит юнит-тесты.
Итак, форма есть, создаем тестовый проект:
- Удаляем все лишнее.
- Добавляем ссылки на сборки White.Core (собственно White) и UnitTesting.White.
- Не забываем добавить ссылку на проект с формой, которую мы собираемся тестировать и ссылку на System.Windows.Forms.dll
- Класс SimpleFormTestFixture наследуем от TestFixture.
- Создаем метод FixtureInitialize, который создает нам саму форму. Метод помечаем аттрибутом FixtureInitialize.
- Пишем три тестовых метода ClickButton1, ClickButton2 и ClickButton3, пользуясь средствами API White.
- А теперь немного "магии" - в свойствах проекта SimpleForm.Tests меняем Output type на Windows Application.
- В тестовый проект добавляем файл, назовем его EntryPoint.cs с таким содержимым:
[STAThread]
static void Main()
{
TestFixture.Run();
}
Так... Как оказалось я совершенно не подготовился к своему первому посту! Я не умею копировать код из студии и вставлять его как HTML, каждый раз как я вставляю картинку, у меня съезжает форматирование и картинку надо мучительно долго перетаскивать вниз текста (она не вставляется в текущее местоположение курсора?!). И самое главное, я не знаю как приаттачить файлы сольюшна, чтобы показать как это всё работает. А оно работает, уж поверьте мне!
Поэтому горе-писатель отправляется спать, обещая всем несчастным, кому "посчастливилось" читать этот пост, что в следующий раз я покажу более сложный пример, в котором будет виден и главный недостаток данного подхода к тестированию. Stay tuned!
Updated: опробовал CopySourceAsHtml, вроде неплохо :-)
Updated: опробовал CopySourceAsHtml, вроде неплохо :-)
Комментариев нет:
Отправить комментарий