понедельник, 14 октября 2013 г.

AutomationProperties при тестировании пользовательского интерфейса

При использовании Microsoft Test Manager (MTM ) для тестирования пользовательского интерфейса есть два варианта ручное и автоматизированное тестирование. Автоматизированное, от ручного, отличается тем, что выполнив ручной тест, мы можем записать последовательность действий и запускать эту последовательность действий для выполнения регрессионного теста, или для проверки воспроизводится ошибка или нет. При записи, особенно когда идет выбор элемента в списке у MTM возникает проблема с идентификацией. Например, когда мы записывали тест, у нас сотрудник Иванов был третьим в списке, а сейчас, он второй. О том, как облегчить жизнь тестировщикам и улучшить определение элементов я сегодня и расскажу.

Давайте сначала покажу проблему. Создаю тривиальное приложение, в котором будет список фамилий. Тест должен выбрать одну из них.
Для демонстрации я воспользуюсь приложением в котором главная форма имеет разметку:
<Window x:Class="WpfApplication24.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.Resources>
            <DataTemplate x:Key="myTemplate">
                <TextBlock Text="{Binding LastName}" />
            </DataTemplate>
        </Grid.Resources>        
        <ListView ItemsSource="{Binding}" ItemTemplate="{StaticResource myTemplate}" />
    </Grid>
</Window>
Код:
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }
 
    public class Person
    {
        public string LastName { getset; }
 
        public int Age { getset; }
    }
 
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        List<Person> persons = new List<Person>();
        persons.Add(new Person() { LastName = "Иванов", Age = 20 });
        persons.Add(new Person() { LastName = "Петров", Age = 22 });
        persons.Add(new Person() { LastName = "Сидоров", Age = 25 });
        this.DataContext = persons;
    }
}
Запускаем тест из MTM, не забываем включить запись действий. Кликаем на второй элемент списка (1). И видим что он не может быть идентифицирован (2):
К счастью, именно для идентификации DataTemplate есть специальный класс AutomationProperties. Все что нам нужно, это прописать присоединенное свойство Name. Причем, чтобы можно было кликать не только на TextBlock-е, а на любом месте элемента списка, придется добавлять это свойство к контейнеру элемента. В нашем случае это ListViewItem. Т.е. в ресурсы добавляем еще вот такой стиль:
<Style TargetType="ListViewItem">
    <Setter Property="AutomationProperties.Name" Value="{Binding Path=LastName}"/>
</Style>
Все, теперь при выборе элемента в списке мы увидим:
Все выбралось, причем однозначно. В реальном проекте, конечно лучше не надеяться на одно поле (если это поле не первичный ключ типа GUID), в таких случаях можно биндиться к пане свойств, например так:
<Style TargetType="ListViewItem">
    <Setter Property="AutomationProperties.Name">
        <Setter.Value>
            <MultiBinding StringFormat="lvi_{0}-{1}">
                <Binding Path="LastName" />
                <Binding Path="Age" />
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>
Все. 

Комментариев нет:

Отправить комментарий