суббота, 12 декабря 2009 г.

Тестирование UI с помощью White. Часть первая.

Я полюбил юнит-тесты. Они мои друзья. Они вселяют в меня спокойствие и уверенность в своих действиях, всякий раз когда я принимаюсь за рефакторинг кода. Но есть код, который, как ни старайся, силами "настоящих" (о "настоящих" юнит-тестах как-нибудь в другой раз) юнит-тестов не покроешь - UI код. Да, где то ближе к вершине "пирамиды" тестов (еще одна тема для маленького поста), построенной на прочном фундаменте юнит-тестов, будут End-To-End тесты, User Acceptance тесты и т.д. Но мне хочется иметь быстрое и простое как в написании, так и в поддержке, средство, которое позволит мне тестировать отдельные формы. В конце концов формы - это то, с чем работает пользователь, то что для него и ассоциируется с программой.

Для первого примера возьмем простейшую форму с тремя кнопками и одним полем ввода:

Нажатие на кнопку должно приводить к появлению ее названия в поле ввода. Однако в код вкралась ошибка - нажатие на button3 обрабатывается тем же обработчиком, что и для button1. Обычная ошибка в wiring code. Однако юнит-тестами, даже если бы они тут были, такую ошибку не обнаружить. Посмотрим как нам в этом может помочь White.

Сразу хочу обговорить некоторые важные моменты:
  • Я старался добиться максимально простого кода настройки "окружения" теста. Простота написания теста - меньше причин его не писать.
  • Исходя из вышесказанного я принял за аксиому следующее: один тест-класс тестирует одну форму. Здесь не было никаких технических проблем дать возможность указать для каждого тестового метода какую форму он будет тестировать, но это заметно усложняет настройку "окружения".
  • "Пирамида" тестирования строится снизу вверх. Ничто не заменит юнит-тесты.
Итак, форма есть, создаем тестовый проект:



  1. Удаляем все лишнее.
  2. Добавляем ссылки на сборки White.Core (собственно White) и UnitTesting.White.
  3. Не забываем добавить ссылку на проект с формой, которую мы собираемся тестировать и ссылку на System.Windows.Forms.dll
  4. Класс SimpleFormTestFixture наследуем от TestFixture.
  5. Создаем метод FixtureInitialize, который создает нам саму форму. Метод помечаем аттрибутом FixtureInitialize.
  6. Пишем три тестовых метода ClickButton1, ClickButton2 и ClickButton3, пользуясь средствами API White.
  7. А теперь немного "магии" - в свойствах проекта SimpleForm.Tests меняем Output type на Windows Application.
  8. В тестовый проект добавляем файл, назовем его EntryPoint.cs с таким содержимым:
        [STAThread]
        static void Main()
        {
            TestFixture.Run();
        }

Так... Как оказалось я совершенно не подготовился к своему первому посту! Я не умею копировать код из студии и вставлять его как HTML, каждый раз как я вставляю картинку, у меня съезжает форматирование и картинку надо мучительно долго перетаскивать вниз текста (она не вставляется в текущее местоположение курсора?!). И самое главное, я не знаю как приаттачить файлы сольюшна, чтобы показать как это всё работает. А оно работает, уж поверьте мне!

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

Updated: опробовал CopySourceAsHtml, вроде неплохо :-)

Комментариев нет:

Отправить комментарий

Wider Two Column Modification courtesy of The Blogger Guide