Skip to content

Improve app testability (RU)

Gleb Golovin edited this page Apr 10, 2018 · 1 revision

Вступление

Подготовить приложение - это значит сделать его более тестируемым.

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

Уникальные идентификаторы

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

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

Проставить идентификаторы можно разными способами, например:

  • через свойство элемента в XAML-е

    <TextBox Uid="KeyTextBox"/>
    <TextBox AutomationProperties.AutomationId="ValueTextBox"/>
  • через стили

    <Style <...> >
        <Setter Property="Uid" Value="{Binding Title}"/>
    </Style>
  • в WinForms приложениях уникальный идентификатор это свойство Name

Поддержка технологии UI Automation

Если элемент не стандартный, то вполне возможно, что его реализация не поддерживает технологию UI Automation. В таком случае выставление свойства AutomationId не делает ничего. Тогда элемент придется немного доработать. Пример минимальной доработки для элемента Xceed.Wpf.Toolkit.DateTimePicker:

public class DateTimePickerExt : DateTimePicker
{
    // Перегружаем получение базового класса автоматизации элемента
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new MyAutomationPeer(this);
    }

    // Модификация базового класса автоматизации
    private class MyAutomationPeer : UIElementAutomationPeer
    {
        public MyAutomationPeer(UIElement owner)
            : base(owner)
        {
        }

        // Перегрузка этого метода позволяет идентифицировать
        // элемент в приложении
        protected override string GetAutomationIdCore()
        {
            return this.Owner.Uid;
        }
    }
}