White — фреймворк для создания автотестов. У него приличный набор windows контролов и достаточно симпатичный API который позволяет легко реализовывать тестовые сценарии.

Для примера напишем тест, который будет проверять работу Notepad. Сценарий примерно такой:



  1. запускаем Notepad;
  2. в текстовое поле пишем «Привет, мир!»;
  3. сохраняем документ в текстовый файл;
  4. проверяем, что файл создан и что его содержимое эквивалентно введенному тексту.


Для начала нужно скачать UI Automation Verify - это утилита для автоматизированного тестирования которая позволяет легко и быстро находить элементы управления и работать с ними. При запуске утилита сканирует все открытые окна и строит карту контролов для каждого из них. В левой части утилиты находится панель со всеми найденными элементами, а в правой — их свойства.



Visual UIVerify

Если какой-то элемент не найден — включаем «режим» Focus Tracking и добираемся нужного контрола. Все что встретится по пути — будет автоматически добавлено к уже существующей мапе.

Переходим к реализации. Создадим проект тестирования и установим White пакет, для этого открываем Package manager console (Alt+T+N+O) и выполняем команду Install-Package TestStack.White.
Создаем новый файл теста и пишем туда такой вот код:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using TestStack.White;
using TestStack.White.UIItems;
using TestStack.White.UIItems.Finders;
using TestStack.White.UIItems.MenuItems;
using TestStack.White.UIItems.WindowItems;
using TestStack.White.UIItems.WindowStripControls;

namespace WhiteTest
{ 
    [TestClass]
    public class NotepadeTest
    {
        [TestMethod]
        public void SavingFileTest()
        {
            //Запускаем приложение
            var notepad = Application.Launch("notepad");
            //Находим в нем главное окно
            var winMain = notepad.GetWindow("Untitled - Notepad");
            //Находим в окне область ввода текста и пешем в нее "Hello, world!"
            var textArea = winMain.Get<TextBox>(SearchCriteria.ByAutomationId("15"));
            textArea.Text = "Hello, world!";
            //еще вводить текст можно так: textArea.Enter("Hello, world!")
            //На главном окне находим MenuBar
            var menu = winMain.Get<MenuBar>(SearchCriteria.ByAutomationId("MenuBar"));
            //Навигация по меню осуществляется методом MenuItem который принимает список подменю
            var btnSaveAs = menu.MenuItem("File", "Save As...");
            //Кликаем по кнопке "Save As..."
            btnSaveAs.Click();
            //Получаем модальное диалоговое окно "Save As"
            var winSaveFileDialog = winMain.ModalWindow("Save As");
            //В диалоговом окне находим поле для ввода имени файла и пешем туда "D:\\test.txt"
            var tbFileName = winSaveFileDialog.MdiChild(SearchCriteria.ByAutomationId("1001"));
            tbFileName.Enter("D:\\test.txt");
            //Ищем кнопочку "Save" и кликаем на нее
            var btnSave = winSaveFileDialog.Get<Button>(SearchCriteria.ByText("Save"));
            btnSave.Click();
            //Если файл уже существует, то может появиться окно подтверждения перезаписи файла
            //если такое окно нашлось, то кликаем кнопку "Yes"
            var winConfirmationDialog = winSaveFileDialog.ModalWindow("Confirm Save As");
            if (winConfirmationDialog != null)
            {
                var btnYes = winConfirmationDialog.Get<Button>(SearchCriteria.ByText("Yes"));
                btnYes.Click();
            }
            //Закрываем приложение
            notepad.Close();
            //Проверяем наличие файла и его содержимое
            Assert.IsTrue(File.Exists("D:\\test.txt"));
            Assert.AreEqual(File.ReadAllText("D:\\test.txt"), "Hello, world!");
        }
    }
}


Если во время выполнения возникает ошибка NonComVisibleBaseClass, то лезаем в Debug настройки и отключаем эту опцию.

image

  1. Переходим в меню Debug->Exceptions...
  2. Раскрываем «Managed Debugging Assistants»
  3. Убираем галочку с опции NonComVisibleBaseClass Thrown.
  4. Нажимаем [Ok]


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