Тестирование мультиязычного веб-сервиса a la russe
TRANSCRIPT
Обо мне
• Ведущий тестировщик web-продуктов
• 4 года в 2ГИС
• 8 лет в тестировании
• Сообщество тестировщиков Сибири
3
Присказка:
О чем я расскажу
• Проблемы
• Решения
• Примеры
Определения
• Интернационализация (i18n) — адаптация продукта к переводу
• Локализация (l10n) — перевод продукта на конкретный язык
• Интерфейс,
• Функционал,
• Контент, ...
6
Определения
• Интернационализация (i18n) — адаптация продукта к переводу
• Локализация (l10n) — перевод продукта на конкретный язык
• Локаль — пакет переводов для конкретного языка
• Словарь — файл переводов текстов
7
Сказ первый:
Перевод с нуля
Перевести и протестировать!
9
1. Когда подключать тестирование?
• На этапе выбора инструмента
10
Удобно тестировать
Требования от QA к разработке:
• Простое добавление / удаление новой локали
• Человеко-понятный словарь
• Возможность редактировать словарь
11
Пример
C учетом требований от QA:
• gettext
• .po (Portable Object) + утилиты
• 1 пакет, 1 строка в config, 1 команда
12
2. Где взять данные?
• Используем то, что есть
• Псевдолокализация (имитация переводов)
13
Пример
Русская локаль —>
• Текст + три символа
• Картинки на 180°
• Ссылки .ru —> .it
—> Албанский
14
3. Как проверить грамотность UI?
• Делегируем носителям языка
15
Пример
Кому делегируем?
• Заказчик
• Команда переводчиков
16
Переводя с нуля...
• Тестировать должно быть удобно
• Используйте псевдолокализацию
• Делегируйте проверку грамотности
17
Сказ второй:
Переводим
автотесты
1. В каком объеме можемпереиспользовать тесты?
• Определяем различия
19
Сравниваем тесты и различия
• Тесты на общий функционал отлаживаем
• Оставшиеся — для исходной локали
• Пишем новые
20
Пример
21
2. Как делить входные / выходныеданные?
• Собираем чтобы разделить
23
Собираем чтобы разделить
• Параметризуем
• Собираем в отдельный класс
• Каждой локали — свой класс
24
Пример. Параметризуем вход/выход
public function testSearch()
{
this->searchForm (array(
'what' => 'Музей',
'where' => 'Новосибирск')
);
}
01.
02.
03.
04.
05.
06.
07.
25
Пример. Параметризуем вход/выход
public function testSearch()
{
this->searchForm (array(
'what' => $this->locale->getData('what_request'),
'where' => $this->locale->getData('where_request'))
);
}
01.
02.
03.
04.
05.
06.
07.
26
Пример. Параметризуем вход/выход
public function testSearch()
{
this->searchForm (array(
'what' => $this->locale->getData('what_request'),
'where' => $this->locale->getData('where_request'))
);
}
01.
02.
03.
04.
05.
06.
07.
27
Пример. Создаем словарь
<?php
$msg = array();
$msg['what_request'] = 'Музей';
$msg['where_request'] = 'Новосибирск';
$msg['search_buttom'] = 'Найти';
return $msg;
?>
01.
02.
03.
04.
05.
06.
07.
28
Переводя автотесты...
• Переиспользуйте тесты
• Параметризуйте входные и
выходные данные
29
Сказ третий:
Поддержка
1. Как успеть протестировать, еслипереводов нет?
• Встраиваем переводы в процесс
31
Встраиваем переводы в процесс
• Договариваемся о сроках и ответственностях
• План Б
32
Пример. Процесс
33
Пример. План Б
• Сами переводим на английский
• Откладываем функционал
34
И жили они...
• Перевод с нуля
• Перевод АТ
• Поддержка