Udostępnij za pośrednictwem


Włącz kodowane UI Testowanie formantów

Kontrolą może być łatwiej testowana, jeśli zostanie wprowadzona Obsługa zakodowanych framework testowania interfejsu użytkownika.Wzrost poziomu pomocy technicznej można dodawać stopniowo.Można uruchomić poprzez wspieranie rekord i odtwarzanie i właściwości sprawdzania poprawności.Można budować na tym, aby umożliwić kodowane jako Konstruktor test interfejsu użytkownika, aby rozpoznać właściwości niestandardowych tego formantu i udostępniać niestandardowe klasy dostęp do tych właściwości z wygenerowanego kodu.Może również pomóc kodowane jako interfejs użytkownika test konstruktora przechwytywania akcje w sposób, który znajduje się bliżej zamiarem Akcja zostaje zapisany.

W tym temacie:

  1. Obsługuje rekord i odtwarzanie i sprawdzania poprawności właściwości implementując ułatwień dostępu

  2. Obsługuje niestandardowe sprawdzanie poprawności właściwości implementując Dostawca właściwości

  3. Obsługiwać generowania kodu przez Implementująca klasa właściwości niestandardowe programu Access

  4. Zamiarem-Aware działania wspierające implementując filtr akcji

CUIT_Full

Obsługuje rekord i odtwarzanie i sprawdzania poprawności właściwości implementując ułatwień dostępu

Kodowane jako Konstruktor test interfejsu użytkownika znajdują się informacje dotyczące kontroli, że napotka podczas nagrywania, a następnie generuje kod do odtworzenia tej sesji.Jeśli formant nie obsługuje ułatwień dostępu, kodowane jako Konstruktor test interfejsu użytkownika będzie przechwytywać działania (jak kliknięcie przyciskiem myszy), korzystając z współrzędnymi ekranowymi.Podczas badania jest odtwarzany, wygenerowany kod będzie wystawiać tych kliknięć myszy w tych samych współrzędnych ekranu.Jeśli podczas badania jest odtwarzany w innym miejscu na ekranie pojawi się kontrolą, wygenerowany kod zakończy się niepowodzeniem do wykonania tej akcji formantu.Może to spowodować błędy w, jeśli badanie jest odtwarzany na ekranach o różnych konfiguracjach, w różnych środowiskach lub po nastąpiły zmiany w układzie interfejsu użytkownika.

CUIT_RecordNoSupport

Jeśli zostanie wprowadzona ułatwień dostępu, jednak kodowane jako Konstruktor test interfejsu użytkownika będzie używać, aby przechwytywania informacji na temat formantu, gdy rejestruje test i generuje kod.Następnie po uruchomieniu testu wygenerowany kod będą ponownie odtwarzane tych zdarzeń, przed kontrolą, nawet jeśli jest gdzieś indziej w interfejsie użytkownika.Badania autorów Ponadto można utworzyć deklaracji rozkazujących przy użyciu podstawowe właściwości formantu.

CUIT_Record

Hh552522.collapse_all(pl-pl,VS.110).gifAby obsługiwać nagrywanie i odtwarzanie, sprawdzanie poprawności właściwości i nawigacji dla systemu Windows tworzy sterowania

Ułatwieniach dla kontroli opisanych w poniższej procedurze i omówione szczegółowo w AccessibleObject.

CUIT_Accessible

  1. Wdrożenie klasy, która wynika z Control.ControlAccessibleObjecti zastąpić AccessibilityObject właściwość, aby przywrócić obiekt 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. Dostępny obiekt zastępują Role, State, GetChild i GetChildCount właściwości i metody.

  3. Wdrożenie innego obiektu ułatwień dostępu dla formant podrzędny oraz zastąpić formant podrzędny AccessibilityObject właściwość, aby powrócić do tego obiektu ułatwień dostępu.

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

[!UWAGA]

W tym temacie zaczyna się od próbki ułatwień dostępu w AccessibleObject w tej procedury i następnie opiera się na ten temat w pozostałych procedur.Jeśli chcesz utworzyć działająca wersja próbki ułatwień dostępu, tworzy aplikację konsoli, a następnie zastąpić kod w Program.cs przykładowy kod.Musisz dodać odwołania do ułatwień dostępu, System.Drawing i System.Windows.Forms.Należy zmienić Osadzić typy współdziałania z modelem ułatwień dostępu na wartość False do wyeliminowania ostrzeżenia kompilacji.Projektu typem danych wyjściowych z aplikacji do systemu Windows aplikacji konsoli można zmienić, tak aby okna konsoli, nie pojawia się po uruchomieniu aplikacji.

Obsługuje niestandardowe sprawdzanie poprawności właściwości implementując Dostawca właściwości

Po zaimplementowaniu podstawową obsługę rekord i odtwarzanie i właściwości sprawdzania poprawności, można udostępnić niestandardowe właściwości tego formantu badaniom kodowane jako interfejs użytkownika implementując UITestPropertyProvider dodatek typu plug-in.Na przykład poniższa procedura tworzy Dostawca właściwości, umożliwiający zakodowanej testy interfejsu użytkownika dostępu do właściwości Państwa formantów podrzędnych CurveLegend formantu wykresu.

CUIT_CustomProps

Hh552522.collapse_all(pl-pl,VS.110).gifDo obsługi sprawdzania poprawności właściwości niestandardowych

CUIT_Props

  1. Zastąpić krzywej legendy dostępne obiektu Description właściwość w celu przekazania wartości właściwości sformatowanego na ciąg opisu oddzielone od głównej opis (i siebie) w przypadku wdrażania wielu 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 interfejsu użytkownika w przypadku kontroli przez utworzenie projektu 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.Zmiana osadzić międzyoperacyjny typy ułatwień dostępu na wartość False.

  3. Dodaj właściwość klasy dostawcy, pochodzącej z 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. Wdrożenie Dostawca właściwości poprzez umieszczenie nazw właściwości i deskryptory właściwość w 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. Zastąpić UITestPropertyProvider.GetControlSupportLevel do wskazania, że używanemu zestawowi zapewnia obsługę określonego formantu dla kontroli 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ępowanie pozostałe metody abstrakcyjne 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. Dodaj klasę pakiet rozszerzenia, pochodzącej z 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 atrybut do montażu.

    [assembly: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestExtensionPackage(
                    "ChartControlExtensionPackage",
                    typeof(ChartControlExtensionPackage.ChartControlExtensionPackage))]
    namespace ChartControlExtensionPackage
    {
       …
    
  9. W klasie pakiet rozszerzenia zastąpić UITestExtensionPackage.GetService zwracać klasę dostawcy, właściwości, gdy wymagane jest Dostawca właściwości.

    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ąpienie pozostałe metody abstrakcyjne i właściwościami 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. Budowanie swoje pliki binarne i skopiuj je do % ProgramFiles %\Common\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!UWAGA]

Ten pakiet rozszerzenia zostaną zastosowane do każdego formantu, który jest typu "Tekst".Jeśli testujesz kilka formantów tego samego typu, musisz je przetestować oddzielnie i zarządzania nimi pakietów rozszerzeń, które są wdrożone podczas rejestrowania testy.

Obsługiwać generowania kodu przez Implementująca klasa właściwości niestandardowe programu Access

Gdy kodowane jako Konstruktor test interfejsu użytkownika generuje kod z nagrania sesji, korzysta z UITestControl klasy, aby uzyskać dostęp formanty.

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

Jeśli zaimplementowano Dostawca właściwości, aby zapewnić dostęp do właściwości niestandardowych tego formantu, można dodać wyspecjalizowane klasy, która jest używana dostęp do tych właściwości tak, aby wygenerowany kod jest uproszczone.

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

Hh552522.collapse_all(pl-pl,VS.110).gifAby dodać klasę specjalistyczne do użytkownika kontroli dostępu

CUIT_CodeGen

  1. Wdrożenie klasy pochodzącej z 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. Implementować niestandardowe właściwości tego formantu jako właściwości klasy.

    public virtual string State
    {
        get
        {
            return (string)GetProperty("State");
        }
    }
    
  3. Zastąpić usługodawcy właściwość UITestPropertyProvider.GetSpecializedClass metoda zwraca typ nowej klasy dla krzywej formantów 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ąpić usługodawcy właściwość GetPropertyNamesClassType metoda zwraca typu metody PropertyNames nową klasę.

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

Zamiarem-Aware działania wspierające implementując filtr akcji

Visual Studio rejestruje test, ujmuje każdego zdarzenia myszy i klawiatury.Jednak w w niektórych przypadkach zamiarem działania mogą zostać utracone w serii zdarzeń myszy i klawiatury.Na przykład jeśli formant obsługuje autouzupełniania, ten sam zestaw zdarzeń klawiatury oraz myszy może powodować inną wartość podczas badania jest odtwarzany w innym środowisku.Można dodać filtr akcji dodatku plug-in zastępującym serii zdarzeń klawiatury oraz myszy z pojedynczej operacji.W ten sposób można zastąpić serii zdarzeń myszy i klawiatury w wyborze wartość z pojedynczej operacji, które ustawia wartość wyniku.Robi to chroni zakodowanej testy interfejsu użytkownika z różnic w funkcji autouzupełniania z jednego środowiska do innego.

Hh552522.collapse_all(pl-pl,VS.110).gifWspieranie działań zamiarem aware

CUIT_Actions

  1. Wdrożenie klasy filtr akcji, pochodzącej z UITestActionFilter, zastępując 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ąpić ProcessRule.Przykład tutaj realpces Akcja dwukrotnego kliknięcia, za pomocą jednego, kliknij menu Akcja.

    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, aby GetService metoda Twój pakiet 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. Budowanie swoje pliki binarne i skopiuj je do % ProgramFiles %\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

[!UWAGA]

Filtr akcji nie zależy od implementacji dostępności ani na dostawcę właściwość.

Program Debug: polecenie Dostawca właściwości lub działania filtru

Filtr właściwości dostawcy i działania są implementowane w pakiet rozszerzenia, która jest ładowana i uruchamiane przez kodowane jako budowniczy test interfejsu użytkownika w procesie oddzielnym od aplikacji.

Filtr właściwości dostawcy lub akcja debugowania

  1. Budowanie debugującej kopii pakietu rozszerzenia plików .dll i .pdb do % ProgramFiles %\Common Files\Microsoft Shared\VSTT\10.0\UITestExtensionPackages.

  2. Uruchomienie aplikacji (nie w oknie Debuger).

  3. Uruchom Konstruktora kodowane jako test interfejsu użytkownika.

    codedUITestBuilder.exe /standalone

  4. Dołączać debuger do procesu codedUITestBuilder.

  5. Ustawić punkty przerwania w kodzie.

  6. W Konstruktorze kodowane jako test interfejsu użytkownika, należy utworzyć twierdzi, aby wykonywać swoje Dostawca właściwości i zarejestrować akcje do wykonywania akcji filtrów.

Zasoby zewnętrzne

Hh552522.collapse_all(pl-pl,VS.110).gifWskazówki

Badania na nieprzerwane z Visual Studio 2012-rozdział 2: Testowanie jednostek: testowanie wewnątrz

Zobacz też

Informacje

AccessibleObject

Koncepcje

Weryfikowanie kodu przy użyciu kodowanych testów interfejsu użytkownika