piątek, 4 stycznia 2013

70-511 Rozdział 11 - Testowanie interfejsu użytkownika

WPF oferuje automatyczne testowanie interfejsu użytkownika. Nie jest to proste zadanie ze względu na drzewiastą strukturę interfejsu graficznego.
Testowanie automatyczne w WPF-ie zostało umożliwione poprzez zaimplementowanie podstawowych operacji kontrolek w klasach dziedziczących po bazowej klasie AutomationPeer.Klasy te łatwo rozpoznać po nazwie która składa się z nazwy kontrolki + AutomationPeer: <control>AutomationPeer np dla kontrolki przycisku będzie to ButtonAutomationPeer.
Bazowa klasa AutomationPeer posiada cztery przydatne metody:
  • GetChildren - zwraca elementy zawarte w aktualnym jako obiekty typu AutomationPeer
  • GetName - zwraca nazwę kontrolki, powiązanej z aktualnym obiektem AutomationPeer
  • GetParent - zwraca element nadrzędny jako obiekt typu AutomationPeer
  • GetPattern - zwraca interfejsy powiązane z aktualnym testem, umożliwiające testowanie
Lista interfejsów, implementowanych przez klasy dziedziczące z AutomationPeer i zapewniające funkcjonalność podczas testów:
  • IDockProvider - dla kontrolek, które oferują możliwości dokowania w kontenerze
  • IExpandCollapseProvider - dla kontrolek, które mogą być zwijane i rozwijane 
  • IGridItemProvider - dla kontrolek, które mogą się znaleźć w kontrolce typu Grid
  • IGridProvider - dla kontrolek będących kontenerami
  • IInvokeProvider - dla kontrolek, które wykonują tylko jedną akcję
  • IItemContainerProvider - oferuje metody pozwalające odnaleźć element na liście obiektów
  • IMultipleViewProvider - dla kontrolek pozwalających wyświetlać dane w różny sposób 
  • IRangeValueProvider - dla kontrolek pozwalających ustawiać zakres
  • IScrollItemProvider - dostęp do elementów kontrolek implementujących interfejs IScrollProvider
  • IScrollProvider - kontrolki umożliwiające przewijanie
  • ISelectionItemProvider - kontrolki umożliwiające wybór elementu - implementują interfejs ISelectionProvider
  • ISelectionProvider - kontrolki pełniące funkcję kontenera dla elementów możliwych do zaznaczenia
  • ISynchronizedInputProvider - kontrolki wspierające synchroniczne wprowadzanie zawartości
  • ITableItemProvider - element kontrolki implementującej interfejs ITableProvider
  • ITableProvider - dla kontrolek typu zakładkowego
  • ITextProvider - dla kontrolek zawierających tekst
  • ITextRangeProvider - pozwala na dostęp do bloku tekstu
  • IToggleProvider - obsługa kontrolek posiadających stan
  • ITransformProvider - kontrolki mogące być powiększane, obracane i przesuwane w 2D
  • IValueProvider - dostęp do wartości kontrolki, która może być reprezentowana jako tekst
  • IVirtualizedItemProvider - element, który może być użyty na panelu wirtualnym
  • IWindowProvider - reprezentuje operacje oferowane przez okno aplikacji
Konkretny interfejs pobieramy poprzez metodę GetPattern.
Przykład dla kontrolki przycisku:

Code:
<Window x:Class="WPF_AutomationPeer_Testing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Button Name="Przycisk1" Content="Przyck1" Click="ButtonBase_OnClick" />
        <Button Name="PrzyciskTest" Content="Test" Grid.Row="1" Click="PrzyciskTest_OnClick"></Button>
    </Grid>
</Window>

Code:
using System.Windows;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;

namespace WPF_AutomationPeer_Testing
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Kliknięto w przycisk");
        }

        private void PrzyciskTest_OnClick(object sender, RoutedEventArgs e)
        {
            var buttonAutomationPeer = new ButtonAutomationPeer(Przycisk1);
            var pattern = (IInvokeProvider)buttonAutomationPeer.GetPattern(PatternInterface.Invoke);
            pattern.Invoke();
        }
    }
}

Kod do pobrania: http://sdrv.ms/WYcoxC

Brak komentarzy:

Prześlij komentarz