main

Автоматизация тестирования

4 бесплатных способа автоматизации GUI-тестирования QT-приложений под Windows

Июль 25, 2013 — 1

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


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

В данной статье мы рассмотрим бесплатные инструменты для автоматизации тестирования Windows-приложений, разработанных с использованием библиотек QT. Ниже приведен список возможных инструментов, которые помогут повысить качество вашего продукта.

Обзор бесплатных решений

I. Фреймворк QTestLib

Для начала рассмотрим фреймворк QTestLib, который отвечает за модульное тестирование в QT. К сожалению, для тестирования пользовательского интерфейса он предоставляет намного меньше возможностей, чем для написания unit-тестов. Единственной функцией для GUI-тестирования в QTestLib является симуляция мыши и клавиатуры.

C точки зрения автоматизации тестирования, такой вариант далеко не самый оптимальный. При его использовании происходит смешение unit-тестов (разрабатываемых программистами) и GUI-тестов (разрабатываемых тестировщиками). К тому же, важно не только кликнуть по той или иной координате окна, но и получить свойства контролов и выполнить паттерны, реализуемые этим контролом. Поэтому останавливаться на нем не будем, а перейдем к более функциональным инструментам. Желающие узнать о фреймворке QTestLib больше, могут ознакомиться с главами 3 и 4 учебника по QTestLib.

II. UI Automation

UI Automation – это технология, которая использует для доступа к элементам управления интерфейсом механизм Microsoft Active Accessibility (MSAA). Появилась она достаточно давно, вместе с выходом Windows Presentation Foundation. Многие платные решения (например, Ranorex) используют UI Automation для доступа к контролам.

Каждый элемент представляется в виде объекта AutomationElement, в котором определены его основные идентификаторы. Некоторые контролы могут реализовывать так называемые паттерны. Например, паттерн ExpandCollapsePattern служит для сворачивания и разворачивания элемента меню. Для получения поддерживаемых паттернов используется метод GetSupportedPatterns. Для поиска контрола с заданным значением свойства используется класс PropertyCondition.

При написании тестов идентификаторы контролов, их свойства и возможные паттерны удобно смотреть при помощи утилиты UISpy.

Итак, как же использовать UI Automation в QT-приложениях. Необходимо собрать приложение с поддержкой accessibility — добавить плагин QT_dirpluginsaccessible. Подробнее про эту операцию можно почитать тут. После этого появляется возможность использования UI Automation.
Для лучшего понимания приведем пример простого теста, который запускает приложение, разворачивает меню «File» и нажимает на «Exit»:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Automation;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UIAutomationLib
{
    [TestClass]
    public class Sample
    {
        [TestMethod]
        public void TestMethod()
        {
            Process process = null;

            try
            {
                // Запуск приложения
                process = Process.Start("путь к приложению");

                // Ожидание запуска
                System.Threading.Thread.Sleep(500);

                // Поиск окна
                AutomationElement window = AutomationElement.FromHandle(process.MainWindowHandle);

                // Поиск меню "File" и разворачивание
                AutomationElement fileMenu = window.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "File"));
                ((ExpandCollapsePattern)fileMenu.GetCurrentPattern(ExpandCollapsePattern.Pattern)).Expand();

                // Ожидание разворачивания
                System.Threading.Thread.Sleep(500);

                // Поиск подменю "Exit" и нажатие
                AutomationElement exitMenu = window.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Exit"));
                ((InvokePattern)exitMenu.GetCurrentPattern(InvokePattern.Pattern)).Invoke();
            }
            finally
            {
                if (process != null)
                    process.Kill();
            }
        }
    }
}

Отдельно стоит отметить, что если для разработки вы используете Visual Studio версии Professional, Premium или Ultimate, то вам становится доступен такой инструмент, как Coded UI Test. В него включен Test Recorder, который записывает действия пользователя и автоматически генерирует тесты с использованием UI Automation. Но поскольку указанные выше версии Visual Studio стоят немалых денег, то подробно в рамках данной статьи рассматривать Coded UI Test мы не будем.

III. Фреймворк White

Фреймворк White представляет из себя расширение UI Automation, которое делает доступ к контролам и их свойствам более удобным. Найти его вы можете здесь. Все особенности, перечисленные для UI Automation, касаются и White.
Чтобы понять преимущества при его использовании, переделаем первоначальный пример с использованием этого фреймворка.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using White.Core;
using White.Core.UIItems.Finders;
using White.Core.UIItems.MenuItems;
using White.Core.UIItems.WindowItems;
using White.Core.UIItems.WindowStripControls;

namespace WhiteLib
{
    [TestClass]
    public class Sample2
    {
        [TestMethod]
        public void TestMethod()
        {
            Application app = null;
            try
            {
                // Запуск приложения
                app = Application.Launch("путь к приложению");
                // Поиск главного окна
                Window window = app.GetWindow("Имя окна");
                // Поиск меню "File"
                var fileMenu = window.Get<Menu>(SearchCriteria.ByText("File"));
                // Открытие меню
                fileMenu.Click();
                // Поиск подменю "Exit"
                var exitMenu = window.Get<Menu>(SearchCriteria.ByText("Exit"));
                // Открытие меню
                exitMenu.Click();
            }
            finally
            {
                app.Close();
            }
        }
    }
}

Как видно из примера, обращение к контролам и выполнение действий над ними стало намного читабельнее, а изменение тестов — проще.

IV. PowerShell Extensions

Автоматизация тестирования доступна с использованием встроенных инструментов Windows: powershell, а также расширения UI Automation PowerShell Extensions. Найти расширения можно здесь. Этот инструмент позволяет делать тестирование более гибким и независимым относительно среды выполнения. Например, при конфигурационном тестировании вам достаточно скопировать скрипты на виртуальные машины, где они будут выполняться. Никакого дополнительного ПО (кроме UIAutomation.dll) устанавливать не надо.

Как выглядит простой скрипт автоматизации QT приложений на Powershell:

#Подключение библиотеки UIAutomation
ipmo E:powershellUIAutomation.0.8.0P4.NET35UIAutomation.dll

#Запуск приложение по пути "путь к приложению"
Start-Process 'путь к приложению' -PassThru | Get-UIAWindow;

#Нажатие Файл->Выход
Get-UIAMenuItem -Name 'Файл' | Invoke-UIAMenuItemExpand ;
Get-UIAMenuItem -Name 'Выход' | Invoke-UIAButtonClick ;

Заключение

Каждый проект уникален и не существует «самого лучшего» способа автоматизации тестирования пользовательского интерфейса. При выборе необходимо отталкиваться от таких параметров, как бюджет проекта, навыки команды тестировщиков, уже используемые инструменты. Также не следует сразу отказываться от платных инструментов автоматизации – возможно, ROI от их покупки превысит первоначальные ожидания.

Мы постарались привести обзоры инструментов автоматизации тестирования QT-приложений, основываясь на наших знаниях и опыте и надеемся, что эта статья будет вам полезна. Удачи в автоматизации!

One comment

  • Кристи

    Август 18, 2016 at 15:00

    здорово! очень полезная статья, спасибо )) особенно про framework white понравилось — то, что искала, для работы )

    Reply

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

Адрес вашей почты не будет отображаться в комментарии. Обязательные поля отмечены символом *