Поделиться через


Включение закодированных тестов пользовательского интерфейса для элементов управления

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

Содержание раздела

  1. Поддержка проверки записи и воспроизведения и свойства путем реализации специальных возможностей

  2. Поддержка проверки пользовательского свойства путем реализации поставщика свойства

  3. Поддержка создания кода путем реализации класса для получения пользовательских свойств

  4. Поддержка Предназначение- языковых действия путем реализации фильтра действий

CUIT_Full

Поддержка проверки записи и воспроизведения и свойства путем реализации специальных возможностей

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

CUIT_RecordNoSupport

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

CUIT_Record

Hh552522.collapse_all(ru-ru,VS.110).gifДля записи и воспроизведения проверку и свойства навигации для управления форм Windows

Реализуйте специальных возможностей для элемента управления, как описано в разделе следующей процедуре и подробно пояснения см. в AccessibleObject.

CUIT_Accessible

  1. Реализуйте класс, производный от Control.ControlAccessibleObject, и переопределить свойство AccessibilityObject для получения объекта класса.

    public partial class ChartControl : UserControl
    {
        // Overridden to return the custom AccessibleObject for the control.
        protected override AccessibleObject CreateAccessibilityInstance()
        {
            return new ChartControlAccessibleObject(this);
        }
    
        // Inner class ChartControlAccessibleObject represents accessible information
        // associated with the ChartControl and is used when recording tests.
        public class ChartControlAccessibleObject : ControlAccessibleObject
        {
            ChartControl myControl;
            public ChartControlAccessibleObject(ChartControl ctrl)
                : base(ctrl)
            {
                myControl = ctrl;
            }
        }
    }
    
  2. Переопределите Role доступного объекта, State, GetChild и GetChildCount свойства и методы.

  3. Реализуйте другой объект специальных возможностей для дочернего элемента управления и переопределить свойство AccessibilityObject дочернего элемента управления для получения этого объекта специальных возможностей.

  4. Переопределите Bounds, Name, Parent, Role, State, Navigate и Select свойства и методы для объекта специальных возможностей дочернего элемента управления.

ПримечаниеПримечание

В начале этого раздела с примером специальных возможностей на AccessibleObject в данной процедуре, и затем построения на одном в остальных процедурах.Если требуется создать рабочая версия образца специальные возможности, создайте консольное приложение, а затем замените код в файле Program.cs на примере кода.Необходимо добавить ссылки на специальные возможности, System.Drawing и System.Windows.Forms.Необходимо изменить Внедрить типы взаимодействия для специальных возможностей значение false, чтобы исключить предупреждение построения.Можно изменить тип выходных данных проекта в из консольному приложению в Windows-приложение так, что окно консоли не отображается при запуске приложения.

Поддержка проверки пользовательского свойства путем реализации поставщика свойства

После реализации базовую поддержку проверки записи и воспроизведения и свойства, можно создать пользовательские свойства элемента управления становятся доступными в закодированный тест пользовательского интерфейса путем реализации подключаемый модуль UITestPropertyProvider.Например, в следующей процедуре создается поставщиком свойства, позволяющий закодированные тесты пользовательского интерфейса для получения свойство свойство дочерних элементов управления CurveLegend элементом управления диаграммы.

CUIT_CustomProps

Hh552522.collapse_all(ru-ru,VS.110).gifПоддержка проверки пользовательского свойства

CUIT_Props

  1. Переопределите свойство Description объекта, кривой, значения свойств передавать богатым в строке описания, через из основного описания (и друг другу при реализации нескольких свойств), точкой с запятой (;).

    public class CurveLegendAccessibleObject : AccessibleObject
    {
        // add the state property value to the description
        public override string Description
        {
            get
            {
                // Add “;” and the state value to the end
                // of the curve legend’s description
                return "CurveLegend; " + State.ToString();
            }
        }
    }
    
  2. Создание пакета расширения тестов пользовательского интерфейса для пользовательского элемента управления необходимо создать проект библиотеки классов и добавьте ссылки на специальные возможности, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common и Microsoft.VisualStudio.TestTools.Extension.Измените Внедрить типы взаимодействия для специальных возможностей значение false.

  3. Добавьте класс поставщика свойства, наследуемый от UITestPropertyProvider.

    using System;
    using System.Collections.Generic;
    using Accessibility;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Microsoft.VisualStudio.TestTools.UITesting.WinControls;
    using Microsoft.VisualStudio.TestTools.UITest.Common;
    
    namespace ChartControlExtensionPackage
    {
        public class ChartControlPropertyProvider : UITestPropertyProvider
        {
        }
    }
    
  4. Реализация поставщика свойства, установив имена свойств и дескрипторы свойств в Dictionary<TKey, TValue>.

    // Define a map of property descriptors for CurveLegend
    private static Dictionary<string, UITestPropertyDescriptor> curveLegendPropertiesMap = null;
    private static Dictionary<string, UITestPropertyDescriptor> CurveLegendPropertiesMap
    {
        get
        {
            if (curveLegendPropertiesMap == null)
            {
                UITestPropertyAttributes read =
                    UITestPropertyAttributes.Readable |
                    UITestPropertyAttributes.DoNotGenerateProperties;
                curveLegendPropertiesMap =
                    new Dictionary<string, UITestPropertyDescriptor>
                        (StringComparer.OrdinalIgnoreCase);
                curveLegendPropertiesMap.Add("State",
                    new UITestPropertyDescriptor(typeof(string), read));
            }
            return curveLegendPropertiesMap;
        }
    }
    
    // return the property descriptor
    public override UITestPropertyDescriptor GetPropertyDescriptor(UITestControl uiTestControl, string propertyName)
    {
        return CurveLegendPropertiesMap[propertyName];
    }
    
    // return the property names
    public override ICollection<string> GetPropertyNames(UITestControl uiTestControl)
    {
        if (uiTestControl.ControlType.NameEquals("Chart") || uiTestControl.ControlType.NameEquals("Text"))
        {
            // the keys of the property map are the collection of property names
            return CurveLegendPropertiesMap.Keys;
        }
    
        // this is not my control
        throw new NotSupportedException();
    }
    
    // Get the property value by parsing the accessible description
    public override object GetPropertyValue(UITestControl uiTestControl, string propertyName)
    {
        if (String.Equals(propertyName, "State", StringComparison.OrdinalIgnoreCase))
        {
            object[] native = uiTestControl.NativeElement as object[];
            IAccessible acc = native[0] as IAccessible;
    
            string[] descriptionTokens = acc.accDescription.Split(new char[] { ';' });
            return descriptionTokens[1];
        }
    
        // this is not my control
        throw new NotSupportedException();
    }
    
  5. Переопределите UITestPropertyProvider.GetControlSupportLevel, чтобы указать, что сборка обеспечивает поддержку для отдельного элемента управления для элемента управления и его дочерних элементов.

    public override int GetControlSupportLevel(UITestControl uiTestControl)
    {
        // For MSAA, check the control type
        if (string.Equals(uiTestControl.TechnologyName, "MSAA",
            StringComparison.OrdinalIgnoreCase) &&
            (uiTestControl.ControlType == "Chart"||uiTestControl.ControlType == "Text"))
        {
            return (int)ControlSupport.ControlSpecificSupport;
        }
    
        // This is not my control, so return NoSupport
        return (int)ControlSupport.NoSupport;
    }
    
  6. Переопределите оставшиеся абстрактные методы Microsoft.VisualStudio.TestTools.UITesting.UITestPropertyProvider.

    public override string[] GetPredefinedSearchProperties(Type specializedClass)
    {
        throw new NotImplementedException();
    }
    
    public override Type GetSpecializedClass(UITestControl uiTestControl)
    {
        throw new NotImplementedException();
    }
    
    public override Type GetPropertyNamesClassType(UITestControl uiTestControl)
    {
        throw new NotImplementedException();
    }
    
    public override void SetPropertyValue(UITestControl uiTestControl, string propertyName, object value)
    {
        throw new NotImplementedException();
    }
    
    public override string GetPropertyForAction(UITestControl uiTestControl, UITestAction action)
    {
        throw new NotImplementedException();
    }
    
    public override string[] GetPropertyForControlState(UITestControl uiTestControl, ControlStates uiState, out bool[] stateValues)
    {
        throw new NotImplementedException();
    }
    
    
    
    
    
  7. Добавьте в класс пакета расширения, который является производным от UITestExtensionPackage.

    using System;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Microsoft.VisualStudio.TestTools.UITest.Common;
    
    namespace ChartControlExtensionPackage
    {
        internal class ChartControlExtensionPackage : UITestExtensionPackage
        {
        }
    }
    
  8. Задайте атрибут UITestExtensionPackage для сборки.

    [assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage(
                    "ChartControlExtensionPackage",
                    typeof(ChartControlExtensionPackage.ChartControlExtensionPackage))]
    namespace ChartControlExtensionPackage
    {
       …
    
  9. В класс пакета расширения, переопределение UITestExtensionPackage.GetService для возврата класс поставщика свойства, когда поставщик свойства будет запроса.

    internal class ChartControlExtensionPackage : UITestExtensionPackage
    {
        public override object GetService(Type serviceType)
        {
            if (serviceType == typeof(UITestPropertyProvider))
            {
                if (propertyProvider == null)
                {
                    propertyProvider = new ChartControlPropertyProvider();
                }
                return propertyProvider;
            }
            return null;
        }
    
        private UITestPropertyProvider propertyProvider = null;
    }
    
  10. Переопределите оставшиеся абстрактные методы и свойства UITestExtensionPackage.

    public override void Dispose() { }
    
    public override string PackageDescription
    {
        get { return "Supports coded UI testing of ChartControl"; }
    }
    
    public override string PackageName
    {
        get { return "ChartControl Test Extension"; }
    }
    
    public override string PackageVendor
    {
        get { return "Microsoft (sample)"; }
    }
    
    public override Version PackageVersion
    {
        get { return new Version(1, 0); }
    }
    
    public override Version VSVersion
    {
        get { return new Version(10, 0); }
    }
    
  11. Построение, бинарный и скопируйте их в %ProgramFiles% Общее общими \ \ Microsoft \ VSTT \ 10,0 \ UITestExtensionPackages.

ПримечаниеПримечание

Этот пакет расширения будет применяться к любому элементу управления, типа "текст".При выполнении нескольких элементов управления того же типа, необходимо выполнить их поодиночке, расширения и управления пакетами развертывания при написании тестов.

Поддержка создания кода путем реализации класса для получения пользовательских свойств

Если построитель закодированных тестов пользовательского интерфейса создает код из записи сеанса, он использует класс UITestControl для получения элементов управления.

UITestControl uIAText = this.UIItemWindow.UIChartControlWindow.UIAText;
Assert.AreEqual(this.AssertMethod3ExpectedValues.UIATextState, uIAText.GetProperty("State").ToString());

При реализации поставщика свойства для предоставления доступа к пользовательским свойствам элемента управления, можно добавить специализированный класс, используемый для доступа к этим свойствам, что созданный код будет упрощен.

ControlLegend uIAText = this.UIItemWindow.UIChartControlWindow.UIAText;
Assert.AreEqual(this.AssertMethod3ExpectedValues.UIATextState, uIAText.State);

Hh552522.collapse_all(ru-ru,VS.110).gifДобавление специализированный класс для доступа к элементу управления

CUIT_CodeGen

  1. Реализуйте класс, производный от WinControl и добавьте тип элемента управления к коллекции свойств поиска в конструкторе.

    public class CurveLegend:WinControl 
    {
       public CurveLegend(UITestControl c) : base(c) 
       {
          // The curve legend control is a “text” type of control
          SearchProperties.Add(
             UITestControl.PropertyNames.ControlType, "Text");
       }
    }
    
  2. Реализуйте пользовательские свойства элемента управления как свойства класса.

    public virtual string State
    {
        get
        {
            return (string)GetProperty("State");
        }
    }
    
  3. Переопределите метод UITestPropertyProvider.GetSpecializedClass поставщика свойства для возврата нового типа класса для дочерних элементов управления, кривой.

    public override Type GetSpecializedClass(UITestControl uiTestControl) 
    { 
       if (uiTestControl.ControlType.NameEquals("Text")) 
       { 
          // This is text type of control. For my control,
          // that means it’s a curve legend control.
          return typeof(CurveLegend); 
       } 
    
       // this is not a curve legend control
       return null;
    }
    
  4. Переопределите метод GetPropertyNamesClassType поставщика свойства, чтобы возвратить тип метода PropertyNames новых классов.

    public override Type GetPropertyNamesClassType(UITestControl uiTestControl)
    {
        if (uiTestControl.ControlType.NameEquals("Text"))
        {
          // This is text type of control. For my control,
          // that means it’s a curve legend control.
            return typeof(CurveLegend.PropertyNames);
        }
    
        // this is not a curve legend control
        return null;
    }
    

Поддержка Предназначение- языковых действия путем реализации фильтра действий

Visual Studio при записи теста он записываются все события мыши и клавиатуры.Однако в некоторых случаях разработчик действия можно потерять серии событий мыши и клавиатуры.Например, если элемент управления поддерживает autocomplete, то один и тот же набор событий мыши и клавиатуры может возникать в разных значения при выполнении теста воспроизводится обратно в другой среде.Можно добавить подключаемый модуль фильтра действий, где данные события клавиатуры и мыши с одним действием.Таким образом, можно заменить ряд событий мыши и клавиатуры и в выделении значение с помощью одного действия, которое задает значение.Это то защищает закодированные тесты пользовательского интерфейса из различий в autocomplete из одной среды в другую.

Hh552522.collapse_all(ru-ru,VS.110).gifПоддержка предназначение- языковых действия

CUIT_Actions

  1. Реализуйте класс фильтра действий, который является производным от UITestActionFilter, предоставляет свойства ApplyTimeout, Category, Enabled, FilterType, Group и Name.

    internal class MyActionFilter : UITestActionFilter
    {
       // If the user actions we are aggregating exceeds the time allowed,
       // this filter is not applied. (The timeout is configured when the
       // test is run.)
       public override bool ApplyTimeout
       {
          get { return true; }
       }
    
       // Gets the category of this filter. Categories of filters
       // are applied in priority order.
       public override UITestActionFilterCategory Category
       {
          get { return UITestActionFilterCategory.PostSimpleToCompoundActionConversion; }
       }
    
       public override bool Enabled
       {
          get { return true; }
       }
    
    
       public override UITestActionFilterType FilterType
       {
          // This action filter operates on a single action
          get { return UITestActionFilterType.Unary; }
       }
    
       // Gets the name of the group to which this filter belongs.
       // A group can be enabled/disabled using configuration file.
       public override string Group
       {
          get { return "ChartControlActionFilters"; }
       }
    
       // Gets the name of this filter.
       public override string Name
       {
          get { return "Convert Double-Click to Single-Click"; }
       }
    
  2. Переопределите метод ProcessRule.Ниже приведен пример realpces действие двойного щелчка с действием один ".

    public override bool ProcessRule(IUITestActionStack actionStack)
    {
        if (actionStack.Count > 0)
        {
            MouseAction lastAction = actionStack.Peek() as MouseAction;
            if (lastAction != null)
            {
                if (lastAction.UIElement.ControlTypeName.Equals(
                     ControlType.Text.ToString(),
                     StringComparison.OrdinalIgnoreCase))
                {
                    if(lastAction.ActionType == MouseActionType.DoubleClick)
                    {
                        // Convert to single click
                        lastAction.ActionType = MouseActionType.Click;
                    }
                }
            }
        }
        // Do not stop aggregation
        return false;
    }
    
  3. Добавление фильтра действий к методу GetService этого пакета расширения.

    public override object GetService(Type serviceType) 
    { 
       if (serviceType == typeof(UITestPropertyProvider)) 
       { 
          if (propertyProvider == null)
          {
             propertyProvider = new PropertyProvider();
          } 
          return propertyProvider;
       } 
       else if (serviceType == typeof(UITestActionFilter)) 
       { 
          if (actionFilter == null)
          {
             actionFilter = new RadGridViewActionFilter();
          }
          return actionFilter; 
       } 
       return null;
    }
    
  4. Построение, бинарный и скопируйте их %ProgramFiles%\ общие файлы общее \ Microsoft \ VSTT \ 10,0 \ UITestExtensionPackages.

ПримечаниеПримечание

Фильтр действий не зависит от реализации специальных возможностей или от поставщика свойства.

Вести отладку поставщик или свойства фильтра действий

У поставщика и фильтр действий свойства реализованы в пакет расширения, который загружается и выполняется построителем закодированных тестов пользовательского интерфейса в процессе независимо от приложения.

Отлаживать поставщик или свойства фильтра действий

  1. Создает отладочную версию копии пакета расширения dll-файлы и %ProgramFiles% pdb-файлы \ общие файлы общее \ Microsoft \ VSTT \ 10,0 \ UITestExtensionPackages.

  2. Запустите приложение в отладчике не ().

  3. Запустите построитель закодированных тестов пользовательского интерфейса.

    codedUITestBuilder.exe /standalone

  4. Вложите отладчик в процесс codedUITestBuilder.

  5. Установите точки останова в коде.

  6. В построителе закодированных тестов пользовательского интерфейса, создайте утверждения для работы поставщика свойства и действия записи работать в фильтры.

Внешние ресурсы

Hh552522.collapse_all(ru-ru,VS.110).gifРуководство

Проверка непрерывной работы с Visual Studio 2012 – Chapter 2: Модульное тестирование: Тестирование внутри

См. также

Ссылки

AccessibleObject

Основные понятия

Проверка кода с помощью закодированных тестов пользовательского интерфейса