Тестирование локализации (сокращенно L10n) приходится проводить для множества языков и сборок. Тестирование пользовательского интерфейса локализованных сборок требует больших затрат ресурсов, поскольку локализованный пользовательский интерфейс необходимо проверять на предмет всех перечисленных ниже типов дефектов:
- все элементы управления
- перевод
- неправильное выравнивание
- дублирующиеся горячие клавиши
- перекрытие
- усечение
Таким образом, автоматизация тестирования локализации пользовательского интерфейса (UI) может привести к значительному сокращению затраченного времени и объемов работ для инженеров по обеспечению качества (quality assurance - QA). Но самое главное - автоматизация позволяет уменьшить количество субъективных ошибок, тем самым повышая качество локализованного пользовательского интерфейса.
Двухфазный процесс автоматизации тестирования локализованного пользовательского интерфейса
Мы разработали автоматизированный процесс тестирования локализованного пользовательского интерфейса. В целом он состоит из двух этапов:
- С помощью Rational Functional Tester мы выводим диалоговое окно тестируемого приложения на экран.
- Мы передаем это диалоговое окно в качестве дескриптора в .dll-файл обертки (созданный нами dll-файл на C#) для извлечения свойств вызываемого диалогового окна пользовательского интерфейса, сохраняем извлеченные свойства интерфейса в XML-файл и анализируем этот XML-файл с целью поиска дефектов интерфейса.
Что мы тестируем
Диалоговое окно состоит из различных элементов управления. Отображение каждого элемента управления на экране определяется соответствующими ему свойствами пользовательского интерфейса . Каждый элемент управления имеет различные свойства. При тестировании локализованного пользовательского интерфейса мы обращаем внимание только на такие свойства элемента управления, как текст, шрифт, стиль, выравнивание текста, размер элемента управления и так далее (см. пример на рисунке 1).
Рисунок 1. Свойства элементов управления
При автоматизации тестирования локализованного пользовательского интерфейса можно извлечь (при помощи вызовов Windows API) свойства элементов управления, а затем сохранить их в XML-файле для дальнейшего анализа. Затем локализованный XML-файл можно проанализировать на наличие дефектов интерфейса, сравнивая его с эталонным XML-файлом на языке оригинала (английском). Результатом анализа будут возможные дефекты пользовательского интерфейса, такие как перевод, усечение, наложение и дублирующиеся горячие клавиши.
Как это работает
Эта задача решается за счет следующих действий:
- При помощи вызовов Windows API создается внешняя DLL-обертка для сбора информации о структуре данного диалогового окна пользовательского интерфейса. DLL-обертка обрабатывает диалоговое окно и создает XML-файл.
- Для вывода диалогового окна тестируемого приложения на экран используется сценарий, записанный в Rational Functional Tester.
- В качестве аргумента в DLL-обертку передается дескриптор активного диалогового окна, содержащий специфичные для пользовательского интерфейса вызовы API.
- С помощью DLL-обертки выполняется извлечение свойств диалогового окна пользовательского интерфейса и их сохранение в XML-файле.
- Вновь созданный XML-файл сравнивается с эталонным английским XML-файлом, а результаты сравнения анализируются с целью выявления имеющихся в пользовательском интерфейсе дефектов.
В следующих двух разделах этот процесс описывается более подробно.
Этап 1. Открытие диалогового окна для тестирования и извлечения его свойств
- В Rational Functional Tester пишется сценарий открытия диалогового окна.
Совет.
Вы можете записывать шаги, используя технологию Record and Play в Rational Functional Tester.
- Посредством DLL-обертки извлекаются свойства элементов управления диалогового окна пользовательского интерфейса:
- Создается DLL-обертка, содержащая специфичные для пользовательского интерфейса вызовы Microsoft® Windows® API, с помощью файла user32.dll.
- С помощью этого DLL-файла извлекаются свойства диалогового окна пользовательского интерфейса.
- Чтобы извлечь свойства диалогового окна пользовательского интерфейса, мы использовали специфичные для интерфейса вызовы Microsoft Windows API с помощью файла user32.dll.
- Затем создается файл DLL-обертки.
Файл DLL-обертки использует дескриптор активного диалогового окна. Дескриптор окна передается в различные вызовы API в файле DLL-обертки. Каждый вызов API перебирает все элементы управления, присутствующие в диалоговом окне, дескриптор которого передается в качестве аргумента. Таким образом анализируются все элементы управления конкретного диалогового окна.
API-вызовы возвращают необходимые свойства всех элементов управления, присутствующих в диалоговом окне пользовательского интерфейса. Возвращаемые свойства сохраняются в XML-файле.
Для тестирования пользовательского интерфейса необходимы следующие свойства:
Control ID (идентификатор элемента управления)
Каждому элементу управления присваивается уникальный идентификатор (ID). Он полезен при сравнении элементов управления с эталонным английским (EN) XML-файлом (см. листинг 1). Это свойство элемента управления остается неизменным для английского (EN) и локализованного диалоговых окон.
Листинг 1. Вызов Windows API для идентификатора элемента управления (Сontrol ID)
DllImport("user32")]
public static extern int GetDlgCtrlID(IntPtr hwnd);
|
Control type (тип элемента управления)
Тип элемента управления помогает классифицировать конкретные элементы управления. Элементы управления могут представлять собой кнопку, текстовое окно, комбинированное окно и т.д. В листинге 2 приведен вызов API.
Листинг 2. Вызов Windows API для типа элемента управления (Control type)
[DllImport("user32.dll")]
public static extern IntPtr GetClassName(IntPtr hwnd, StringBuilder buf, int nMaxCount);
|
Text of the control (текст элемента управления)
Строка текста на элементе управления очень важна. Она будет меняться в зависимости от языка. В листинге 3 приведен вызов API.
Листинг 3. Вызов Windows API для текста элемента управления (Text of the control)
RECT area (прямоугольная область)
Каждый элемент управления ограничен прямоугольником (RECT). Прямоугольная область (RECT area) используется для проверки того, помещается строка на элементе управления в заданную область или нет.
Листинг 4. Вызов Windows API для прямоугольной области (RECT area)
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hWnd, out RECT lprect);
// для хранения координат прямоугольника создайте структуру (Structure) следующим образом:
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
|
Сравнение "до" и "после"
Сгенерированный для каждого диалогового окна XML-файл содержит сведения о каждом отображаемом в диалоговом окне элементе управления. В листингах 5 и 6 приведено содержимое английского (English) и локализованного немецкого (German) XML-файлов.
Листинг 5. Содержимое английского (EN) XML-файла
<?xml version="1.0" encoding="UTF-8"?>
<Dialog>
<CONTROL>
<TEXTS>IBM Cognos TM1 Installation Wizard</TEXTS>
<RECT>206 202 742 588</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22898</CONTROL_ID>
<TEXTS>&Next ></TEXTS>
<TYPE>Button</TYPE>
<RECT>517 555 605 577</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22858</CONTROL_ID>
<TEXTS>< &Back</TEXTS>
<TYPE>Button</TYPE>
<RECT>427 555 515 577</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22863</CONTROL_ID>
<TEXTS>Cancel</TEXTS>
<TYPE>Button</TYPE>
<RECT>610 555 698 577</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22866</CONTROL_ID>
<TEXTS>This Installation Wizard will install IBM Cognos
TM1 - Not For Resale components. </TEXTS>
<TYPE>Static</TYPE>
<RECT>374 344 699 398</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22868</CONTROL_ID>
<TEXTS>Welcome to the IBM Cognos
TM1 - Not For Resale 9.4.1 Installation Wizard.</TEXTS>
<TYPE>Static</TYPE>
<RECT>374 304 699 342</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22879</CONTROL_ID>
<TEXTS>This installation requires a minimum of
10Mb of free disk space on the drive where the temp variable is defined.</TEXTS>
<TYPE>Static</TYPE>
<RECT>374 408 699 462</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22930</CONTROL_ID>
<TEXTS>WARNING: This program is protected by
copyright law and international treaties.</TEXTS>
<TYPE>Static</TYPE>
<RECT>374 468 699 505</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22936</CONTROL_ID>
<TEXTS>NewBinary7</TEXTS>
<TYPE>Static</TYPE>
<RECT>209 231 707 543</RECT>
</CONTROL>
</Dialog>
|
Листинг 6. Содержимое XML-файла для немецкого (German) локализованного диалогового окна
<?xml version="1.0" encoding="UTF-8"?>
<Dialog>
<CONTROL>
<TEXTS>IBM Cognos TM1 Installationsassistent</TEXTS>
<RECT>225 206 761 592</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22898</CONTROL_ID>
<TEXTS>&Weiter ></TEXTS>
<TYPE>Button</TYPE>
<RECT>536 559 624 581</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22858</CONTROL_ID>
<TEXTS>< &Zurück</TEXTS>
<TYPE>Button</TYPE>
<RECT>446 559 534 581</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22863</CONTROL_ID>
<TEXTS>< &Zbbrechen</TEXTS>
<TYPE>Button</TYPE>
<RECT>629 559 717 581</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22866</CONTROL_ID>
<TEXTS>Der Installationsassistent installiert die Komponenten von IBM Cognos
TM1 - Not For Resale.</TEXTS>
<TYPE>Static</TYPE>
<RECT>393 348 718 402</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22868</CONTROL_ID>
<TEXTS>Willkommen beim Installationsassistent für IBM Cognos
TM1 - Not For Resale 9.4.1.</TEXTS>
<TYPE>Static</TYPE>
<RECT>393 308 718 346</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22879</CONTROL_ID>
<TEXTS>Für diese Installation sind mindestens 10MB freie Speicherkapazität auf dem
Laufwerk erforderlich, auf dem die Temporär-Variable definiert ist.</TEXTS>
<TYPE>Static</TYPE>
<RECT>393 423 687 464</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22930</CONTROL_ID>
<TEXTS>WARNUNG: Dieses Programm ist durch
Copyright und internationale Verträge geschützt.</TEXTS>
<TYPE>Static</TYPE>
<RECT>398 472 718 509</RECT>
</CONTROL>
<CONTROL>
<CONTROL_ID>22936</CONTROL_ID>
<TEXTS>NewBinary7</TEXTS>
<TYPE>Static</TYPE>
<RECT>228 235 726 547</RECT>
</CONTROL>
</Dialog>
|
Этап 2. Выполнение различных тестов пользовательского интерфейса с помощью XML-файлов
Когда XML-файлы созданы, их можно проанализировать, чтобы понять, содержат ли они какие-либо дефекты пользовательского интерфейса. В следующих разделах объясняется, как выполнять каждый тест, чтобы найти в локализованном продукте дефекты пользовательского интерфейса.
Тест All controls (все элементы управления)
- Что проверяется?
- Этот тест проверяет, соответствует ли общее число элементов управления, представленных в тестируемом LOC_DLG, их числу в эталонном ENU_DLG.
- Как проверяется?
- Оба XML-файла, LOC_DLG и ENU_DLG, сравниваются с учетом идентификаторов элементов управления, присутствующих в диалоге. Каждый идентификатор элемента управления в XML-файле LOC_DLG сравнивается со всеми идентификаторами элементов управления в эталонном XML-файле ENU_DLG до тех пор, пока не будет найдено соответствие. Если идентификатор элемента управления в тестируемом XML-файле диалога не будет найден в эталонном XML-файле, такой идентификатор отобразится как дополнительный элемент управления.
-
- Аналогичным образом выполняется тестирование на отсутствующие элементы управления.
- Когда сообщается об ошибке?
- Сообщения об ошибках генерируются, если в LOC_DLG в сравнении с ENU_DLG имеются дополнительные или отсутствующие элементы управления .
- Нужно ли эталонное диалоговое окно?
- Да. Соответствующее диалоговое окно ENU_DLG необходимо, поскольку оно используется в качестве эталона.
Тест Translation (перевод)
- Что проверяется?
- Этот тест проверяет, переведены ли элементы управления.
- Как проверяется?
- В данном тесте используются два массива строк. Один массив содержит все строки, извлеченные из тестируемого LOC_DLG, а второй - строки из эталонного ENU_DLG.
-
- Затем соответствующие строки двух массивов сравниваются. Если строка в тесте совпадает со строкой в эталонном массиве, такая строка добавляется в список непереведенных строк. В список непереведенных строк также попадают некоторые исключения, например, название продукта и название компании, которые всегда приводятся на английском. Эти строки-исключения удаляются из списка.
- Когда сообщается об ошибке?
- Сообщение об ошибке генерируется, если текст элемента управления LOC_DLG идентичен тексту элемента управления эталонного ENU_DLG. В противном случае элемент управления рассматривается как переведенный правильно.
- Нужно ли эталонное диалоговое окно?
- Да. Эталонное диалоговое окно необходимо всегда.
Тест Misalignment (неправильное выравнивание)
- Что проверяется?
- Этот тест сравнивает выравнивание элементов управления в LOC_DLG с эталонным ENU_DLG. Он проверяет выравнивание элементов управления относительно определенной оси, если набор этих элементов выравнивается относительно той же оси в эталонном диалоговом окне.
- Как проверяется?
- Создается список всех групп элементов управления, выравниваемых в эталонном диалоге, - групп, содержащих более одного элемента управления с одинаковыми координатами Top (слева), Bottom (снизу), Left (слева) или Right (справа). Затем эти элементы управления анализируются в локализованном диалоге, чтобы убедиться, что все они выровнены относительно одной оси.
-
- В этом тесте сравниваются два XML-файла, чтобы выяснить, выровнены ли элементы управления двух диалогов горизонтально и вертикально. В эталонном XML-файле координаты каждого элемента управления поодиночке сравниваются с координатами других элементов управления. Если при сравнении двух элементов управления координаты Х или Y одинаковы, те же элементы управления проверяются по их идентификаторам и в XML-файле LOC_DLG.
-
- Если координаты, совпадающие в эталонном файле, совпадают и в файле тестируемого диалога, считается, что элементы управления выровнены.
- Когда сообщается об ошибке?
- Сообщение об ошибке генерируется, если какой-либо из элементов управления, которые были выровнены в эталонном диалоговом окне, не выровнен в локализованной версии.
- Нужно ли эталонное диалоговое окно?
- Да. Этот тест нельзя выполнить без эталонного элемента управления. Необходимо знать, какие элементы управления должны быть выровнены.
Тест Repeated hotkeys (дублирующиеся горячие клавиши)
- Что проверяется?
- Тест проверяет все элементы управления диалогового окна на использование совпадающих символов горячих клавиш.
- Как проверяется?
- Для каждого элемента управления, имеющегося в XML-файле тестируемого диалога, проверяется символ горячей клавиши. Каждый символ горячей клавиши элемента управления (символ, следующий за символом амперсанда - "&"), сравнивается с символами горячих клавиш всех других элементов управления. Если данный символ совпадает с символом горячей клавиши любого другого элемента управления, значит, диалоговые окна имеют дублирующиеся горячие клавиши.
- Когда сообщается об ошибке?
- Если у более чем одного элемента управления совпадают горячие клавиши, генерируется сообщение об ошибке.
- Нужно ли эталонное диалоговое окно?
- Необязательно . Наличие эталонного диалогового окна не является необходимым. Если оно имеется, то для каждой обнаруженной ошибки проверяется, не существует ли она в эталонном диалоговом окне.
Тест Overlapping (перекрытие)
- Что проверяется?
- Тест выявляет элементы управления, которые занимают то же пространство, что и другие элементы управления в диалоговом окне.
- Когда сообщается об ошибке?
- Используются RECT-координаты (координаты прямоугольной области) из XML-файла. RECT-координаты каждого элемента управления сравниваются с RECT-координатами других элементов, чтобы определить наличие любых накладывающихся друг на друга элементов управления.
- Когда сообщается об ошибке?
- Сообщение об ошибке генерируется, если элементы управления перекрываются (но не содержатся целиком один внутри другого или не совпадают точно).
- Нужно ли эталонное диалоговое окно?
- Нет. Для этого теста в нем нет необходимости.
Тест Truncation (усечение)
- Что проверяется?
- Этот тест определяет элементы управления, где текст не помещается в отведенную для данного элемента управления область.
- Как проверяется?
- В Windows есть функция (DrawText), которая позволяет находить размер области, необходимой для размещения определенного текста. Для достижения максимальной точности мы используем эту функцию с правильным шрифтом и другой соответствующей элементу управления информацией.
- Когда сообщается об ошибке?
- Если вычисляемый размер области, необходимой для размещения текста, больше, чем размер пространства для отображения текста, генерируется сообщение об ошибке.
- Нужно ли эталонное диалоговое окно?
- Нет. Эталонное диалоговое окно не является необходимым.