Udostępnij za pośrednictwem


Włącz testowanie kodowanego interfejsu użytkownika dla Twoich formantów

Formant można łatwiej przetestować po zastosowaniu obsługę kodowane struktury testów interfejsu użytkownika.Można dodawać stopniowo zwiększa poziom obsługi.Możesz zacząć dzięki obsłudze rekord i odtwarzanie i właściwości sprawdzania poprawności.Tworzenie na tym, aby umożliwić kodowane konstruktora testów interfejsu użytkownika do rozpoznawania niestandardowe właściwości z kontroli i zapewnienia niestandardowej klasy dostęp do tych właściwości z wygenerowanego kodu.Kolejnym sposobem pomagania kodowane interfejsu użytkownika testu konstruktora przechwytywania akcje w sposób, który znajduje się bliżej zamiarem rejestrowana akcji.

W tym temacie:

  1. Obsługuje rekord i odtwarzanie i weryfikacji właściwości dzięki wdrożeniu ułatwień dostępu

  2. Dodaj niestandardowe sprawdzanie poprawności właściwości dzięki wdrożeniu Dostawca właściwości

  3. Obsługuje generowania kodu dzięki wdrożeniu klasę, która ma dostęp do właściwości niestandardowe

  4. Akcje obsługujący opcje pomocy technicznej dzięki wdrożeniu filtr akcji

CUIT_Full

Obsługuje rekord i odtwarzanie i weryfikacji właściwości dzięki wdrożeniu ułatwień dostępu

Kodowane konstruktora testów interfejsu użytkownika umożliwia przechwytywanie informacji na temat formantów napotkał podczas rejestrowania i następnie generuje kod w celu powtarzania tej sesji.Jeśli formant nie obsługuje ułatwień dostępu, kodowane konstruktora testów interfejsu użytkownika przechwytuje akcji (takich jak kliknięcie myszą) za pomocą współrzędnych ekranu.Podczas próby odtwarzania, wygenerowany kod będzie wystawiać tych myszą w takich samych współrzędnych ekranu.Jeśli formant znajduje się w innym miejscu na ekranie podczas odtwarzania badania i wygenerowany kod zakończy się niepowodzeniem do wykonania tej akcji formantu.To może spowodować błędy Jeśli test odtwarzania na ekranie różnych konfiguracji, w różnych środowiskach lub po została zmieniona na układ interfejsu użytkownika.

CUIT_RecordNoSupport

W przypadku zastosowania ułatwień dostępu, jednak kodowane konstruktora testów interfejsu użytkownika będzie używać go do przechwytywanie informacji na temat formantu, gdy rejestruje testu i generuje kod.Następnie po uruchomieniu testu wygenerowany kod będą ponownie odtwarzane tych zdarzeń w odniesieniu do formantu, nawet jeśli jest gdzieś w interfejsie użytkownika.Autorzy testu będzie można utworzyć potwierdza przy użyciu podstawowe właściwości formantu.

CUIT_Record

Aby obsługiwać rekordu i odtwarzanie, właściwości i oraz nawigacji dla systemu Windows formantu formularza

Implementuje ułatwienia dostępu dla formantu opisane w poniższej procedurze i szczegółowo opisane w części AccessibleObject.

CUIT_Accessible

  1. Implementuje klasę pochodzącą z ControlAccessibleObjecti zastąpić AccessibilityObject właściwość do zwrócenia obiektu klasy.

    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. Zastąp dostępnego obiektu Role, State, GetChild i GetChildCount właściwości i metody.

  3. Implementuje innego obiektu ułatwień dostępu dla formant podrzędny i zastąpić formant podrzędny AccessibilityObject właściwość do zwrócenia tego obiektu ułatwień dostępu.

  4. Zastąp Bounds, Name, Parent, Role, State, Navigate, i Select właściwości i metody dla obiektu ułatwień dostępu formant podrzędny.

[!UWAGA]

W tym temacie rozpoczyna się od przykład ułatwień dostępu w AccessibleObject w tej procedury, a następnie kompilacji, na który w procedurach pozostałe.Jeśli chcesz utworzyć pracy wersję przykładu ułatwień dostępu, tworzenie aplikacji konsoli i zamienić kod w plik Program.cs przykładowego kodu.Musisz dodać odwołań do ułatwień dostępu, System.Drawing i System.Windows.Forms.Należy zmienić osadzić typy usługę Międzyoperacyjną ułatwień dostępu do False do wyeliminowania ostrzeżenie kompilacji.Możesz zmienić typ danych wyjściowych projektu do za pośrednictwem konsoli do aplikacji systemu Windows, aby okno konsoli nie pojawia się po uruchomieniu aplikacji.

Dzięki wdrożeniu Dostawca właściwości pomocy technicznej weryfikacji właściwości niestandardowe

Gdy została zaimplementowana podstawowa pomoc techniczna dla rekordu i odtwarzanie i właściwości sprawdzania poprawności, można udostępnić swoje sterowania właściwościami niestandardowymi do kodowane testy interfejsu użytkownika dzięki wdrożeniu UITestPropertyProvider dodatku plug-in.Na przykład poniższa procedura tworzy właściwość dostawcę, który umożliwia kodowane testy interfejsu użytkownika dostępu do właściwości Stan kontrolek podrzędnych CurveLegend formantu wykresu.

CUIT_CustomProps

W celu obsługi weryfikacji właściwości niestandardowej

CUIT_Props

  1. Zastąp krzywej legendy dostępne obiektu Description właściwość umożliwia przekazywanie wartości właściwości zaawansowanych ciąg opisu oddzielona od głównego opis (i innych w przypadku wdrażania wiele właściwości) średnikami (;).

    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. Utwórz pakiet rozszerzenia testów interfejsu użytkownika dla formantu tworząc projekt biblioteki klas i dodaj odwołania do ułatwień dostępu, Microsoft.VisualStudio.TestTools.UITesting, Microsoft.VisualStudio.TestTools.UITest.Common i Microsoft.VisualStudio.TestTools.Extension.Zmień osadzić typy współdziałania ułatwień dostępu na wartość False.

  3. Dodaj właściwości klasy dostawcy, która jest tworzony na podstawie 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. Zaimplementować dostawcę właściwości umieszczając nazwy właściwości i deskryptorów właściwości w Dictionary.

    // 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. Zastąp UITestPropertyProvider.GetControlSupportLevel , aby wskazać, że swojego zestawu zapewnia obsługę określonych kontroli kontrolę i jego elementów podrzędnych.

    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. Zastąp pozostałe metody abstrakcyjne klasy 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. Dodaj klasę pakietu rozszerzenia, która jest tworzony na podstawie 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. Definiowanie UITestExtensionPackage atrybutu dla zestawu.

    [assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage(
                    "ChartControlExtensionPackage",
                    typeof(ChartControlExtensionPackage.ChartControlExtensionPackage))]
    namespace ChartControlExtensionPackage
    {
       …
    
  9. W tej klasie pakietu rozszerzenia, należy zastąpić UITestExtensionPackage.GetService do zwrócenia właściwości klasy dostawcy, jeśli dostawca właściwości jest wymagane.

    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. Zastąp właściwości i metody abstrakcyjne pozostałe 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. Twórz swoje pliki binarne i skopiować je do % ProgramFiles %\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!UWAGA]

Ten pakiet rozszerzenia zostaną zastosowane do każdego formantu, który jest typu "Text".Jeśli testujesz kilka formantów tego samego typu, należy je osobno przetestować oraz zarządzanie nimi pakiety rozszerzenia, które zostały wdrożone podczas rejestrowania testy.

Obsługuje generowania kodu dzięki wdrożeniu klasę, która ma dostęp do właściwości niestandardowe

Jeśli kodowane konstruktora testów interfejsu użytkownika generuje kod z rejestrowania sesji, używa UITestControl klasy dostępu do formantów.

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

Jeśli została zaimplementowana dostawcę właściwości umożliwia dostęp do swojego sterowania właściwościami niestandardowymi, możesz dodać specjalne klasę, która służy do uzyskania dostępu do tych właściwości tak, aby zostało uproszczone wygenerowanego kodu.

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

Aby dodać klasę specjalne kontrolę dostępu

CUIT_CodeGen

  1. Implementuje klasę, która jest tworzony na podstawie WinControl i dodać do kolekcji właściwości wyszukiwania w Konstruktorze typ formantu.

    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. Implementuje niestandardowe właściwości z kontroli jako właściwości klasy.

    public virtual string State
    {
        get
        {
            return (string)GetProperty("State");
        }
    }
    
  3. Zastąp dostawcę właściwości UITestPropertyProvider.GetSpecializedClass metody do zwrócenia typ nowej klasy dla krzywej kontrolek podrzędnych legendy.

    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. Zastąp dostawcę właściwości GetPropertyNamesClassType metody do zwrócenia typu nowa klasa PropertyNames metody.

    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;
    }
    

Akcje obsługujący opcje pomocy technicznej dzięki wdrożeniu filtr akcji

Program Visual Studio rejestruje testu, umożliwia przechwytywanie każdego zdarzenia myszy i klawiatury.Jednak w niektórych przypadkach zamiarem akcji może spowodować utratę w serii zdarzeń klawiatury oraz myszy.Na przykład jeśli formant obsługuje autocomplete, tego samego zbioru zdarzeń klawiatury oraz myszy może powodować innej wartości podczas badania odtwarzania w innym środowisku.Możesz dodać filtr akcji dodatku plug-in zastępujący serie zdarzeń klawiatury oraz myszy z pojedyncze działania.Dzięki temu można zastąpić serie zdarzeń klawiatury oraz myszy, co spowoduje zaznaczenie wartości z jednego akcji, która ustawia wartości.Które chroni kodowane testy interfejsu użytkownika z różnic w autocomplete z jednego środowiska do innego.

Do obsługi obsługujący założeniom akcji

CUIT_Actions

  1. Implementuje klasę filtru akcji, która jest tworzony na podstawie UITestActionFilter, zastępowanie właściwości ApplyTimeout, Category, Enabled, FilterType, Group i 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. Zastąp ProcessRule.Przykład tutaj realpces do akcji kliknij dwukrotnie za pomocą jednego kliknij akcję.

    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. Dodaj filtr akcji do GetService metody pakietu rozszerzenia.

    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. Twórz swoje pliki binarne i skopiować je do % ProgramFiles %\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!UWAGA]

Filtr akcji nie zależy od implementacji dostępności lub Dostawca właściwości.

Debugowanie Twój dostawca właściwości lub filtru akcji

Filtr akcji i dostawcy właściwości są stosowane w pakiecie rozszerzenia ładowany i uruchamiając kodowane konstruktora testów interfejsu użytkownika w procesie oddzielnym od aplikacji.

Aby debugować właściwości filtru akcji lub dostawcy

  1. Tworzenie wersji debugowania kopii pakietu rozszerzenia pliki .dll i .pdb % ProgramFiles %\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

  2. Uruchomienie aplikacji (nie w debuger).

  3. Uruchom Konstruktora kodowane testów interfejsu użytkownika.

    codedUITestBuilder.exe /standalone

  4. Dołącz debugera do procesu codedUITestBuilder.

  5. Ustawianie punktów przerwania w kodzie.

  6. W Konstruktorze kodowanych testów interfejsu użytkownika, należy utworzyć potwierdza do korzystania z dostawcą właściwości i Rejestruj do wykonywania filtrów akcji.

Zasoby zewnętrzne

Wskazówki

Testowanie w przypadku dostarczania ciągłego z programu Visual Studio 2012 w rozdziale 2: testowania jednostek: testowanie wewnątrz

Zobacz też

Informacje

AccessibleObject

Koncepcje

Weryfikowanie kodu przy użyciu automatyzacji interfejsu użytkownika