четверг, 24 января 2013 г.

CodedUITest. Увеличение скорости работы с текстовым полем.

Комментарий к предыдущему посту про утилиты для CodedUITest заставил меня задуматься о том, как же увеличить скорость работы coded UI tests, потому что не секрет, что они работаю небыстро.
Первая операция, про которую я хочу рассказать, и которая выполняется иногда ну ооооочень долго, это ввод текста в текстовое поле. Хотя такая распространенная операция, ай-ай-ай. Скорость выполнения этой операции непостоянная, бывает, что она выполняется быстро, но также часто бывает, что она выполняется очень долго. Стандартными средствами текст в текстовое поле вводится так:

WpfEdit UINameTextBox;
UINameTextBox.Text = "Иван"

Или второй способ:

Keyboard.SendKeys(UINameTextBox, "Иван");

Но оба они работают не очень быстро, а иногда и очень долго.
Как можно ускорить эту операцию? По сути, операция ввода в текстовое поле состоит из следующих - кликнуть в текстовое поле, удалить старый текст (если он есть) и ввести в новый. Мы можем создать наследника класса WpfEdit и переопределить у него свойство Text нужным нам образом:

    /// <summary>
    /// Класс для работы с контролом текстового поля.
    /// </summary>
    public class WpfEditEx : WpfEdit
    {
        /// <summary>
        /// Создает и инициализирует класс текстового поля.
        /// </summary>
        /// <param name="parentControl">Родительский контрол.</param>
        public WpfEditEx(WpfControl parentControl)
            : base(parentControl)
        {
        }
 
        /// <summary>
        /// Создает и инициализирует класс текстового поля.
        /// </summary>
        public WpfEditEx()
        {
        }
 
        /// <summary>
        /// Возвращает/устанавливает текст текстового поля.
        /// </summary>
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                Mouse.Click(this);
                Keyboard.SendKeys("A"ModifierKeys.Control);
                string text = (value.Length == 0) ? "{DELETE}" : value;
                Keyboard.SendKeys(text);
            }
        }
    }

Теперь текст вводится следующим образом - происходит клик мышкой в текстовом поле, выделяется весь текст и с клавиатуры вводится новый текст вместо старого.
Теперь  для работы с текстовым полем вместо класса WpfEdit мы используем класс WpfEditEx.

WpfEditEx UINameTextBox;
UINameTextBox.Text = "Иван"

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

2 комментария:

  1. Лена, пользуясь случаем, хочу поблагодарить тебя за твои предыдущие посты, и за этот в частности. Казалось бы, КодедЮай – это штука известная, идет вместе со студией, а найти что-то полезное и толковое – очень сложно даже в англоязычном интернете.
    А у тебя уже не в первый раз читаю дельный совет. За это тебе и спасибо!

    ОтветитьУдалить