Привет, Хабр! Сегодня мы поговорим о конкретной теме: автоматизация тестирования программного обеспечения для терминалов самообслуживания QIWI. В теме автоматизации тестирования есть области, которые уже неоднократно освещались вдоль и поперек, например, тестирование веб-сервисов.
Для таких областей существуют отдельные инструменты, шаблоны и лучшие практики.
Не нужно ничего придумывать, риски минимальны, просто берешь и делаешь.
Бывают и противоположные ситуации.
Тематика специфическая, готовые решения посмотреть некому, инструментов нет, технологический стек продукта уникален.
Вам предстоит глубоко погрузиться в предметную область, сделать свои инструменты из палок и эээ.
других подручных материалов и при этом собрать множество-много граблей разного размера и убойной силы.
Вот об этом я и хотел поговорить сегодня.
Статья подойдет тем, кто занимается разработкой и тестированием программного обеспечения для банковских терминалов или автоматов самообслуживания.
А также для тех, кто хочет расширить свой технический кругозор примерами «и такое тоже бывает».
Терминал QIWI 2020 года.
На заднем плане видно его содержимое.
Проблема
Первый терминал QIWI появился в 2004 году и тогда появилась возможность пополнять счет мобильного телефона.С тех пор утекло много воды, и АСО (автоматы самообслуживания) сильно изменились.
Теперь вы можете использовать их для пополнения банковских карт, осуществления переводов, оплаты услуг различных поставщиков (провайдеров) - ЖКХ, штрафов ГИБДД, кредитных организаций, собственных продуктов QIWI (КИВИ-кошелек, беспроцентная рассрочка Совесть).
карта).
Терминалы QIWI также могут работать в режиме постамата (автоматического пункта самовывоза для интернет-магазинов).
Что такое терминал?
С аппаратной точки зрения терминал АСО представляет собой обычный настольный компьютер со специфической периферией, такой как купюро- и монетоприемники, принтеры чеков, диспенсеры, POS-терминалы (принимающие пластиковые карты) и т. д. И вот первая проблема.
Эта знаменитая фотография была сделана в округе Сонома в Калифорнии.
Говорят, это натуральные цвета, без какой-либо обработки.
Кстати, именно в округе Сонома располагалась самая южная русская колония в Америке.
Да, это она.
Операционная система, выпуск которой был прекращен в 2014 году, — Windows XP. Выпуск версии POSReady задержался до 2019 года, но.
не все так просто.
Дело в том, что терминалы не являются собственностью QIWI. Они принадлежат партнерам, т.н.
Агенты, индивидуальные предприниматели и юридические лица, заключающие договор с QIWI, приобретают терминалы, арендуют площади в торговых центрах и получают практически пассивный доход. Соответственно, 90% парка терминалов QIWI (а их более 100 тысяч в России и зарубежных странах) работают под управлением Windows XP на самом разнообразном оборудовании – от 512 МБ до 4 ГБ ОЗУ, самых разных процессорах (от Pentium 4 начала 2000-х до более менее современного Core i5) и разное качество и скорость интернета.
Терминалы разного возраста, некоторые из них регулярно обновляются, а другие уже очень давно не обновлялись (работает – не трогайте!).
Наша задача — регулярно поставлять свежие обновления программного обеспечения терминала (оно называется MarATL) и поддерживать совместимость со всем этим многообразием оборудования и периферии.
Операционная система больше не поддерживается
Представим себе простую схему автоматизации тестирования.У нас есть CI-сервер, например TeamCity или Jenkins. Наше терминальное программное обеспечение собирается из сырых материалов по событию (коммит или слияние), куда-то выкладывается собранный бинарный файл.
Программное обеспечение устанавливается автоматически, запускаются ночные функциональные автотесты.
Ээх, стоп! Где установлено программное обеспечение? И как? Как я уже говорил выше, 90 процентов терминалов работают под управлением Windows XP, поддержка которой закончилась в 2014 году.
Это означает, что эта ОС уже давно не соответствует политикам безопасности, для нее не выпускаются обновления, для нее нет свежего рабочего ПО.
, и даже нативная Microsoft Visual Studio компилирует для него С++ только после танцев с бубном, а точнее с тулчейн-версией для ассемблера MSBuild. В общем, запускать тесты и вообще любое ПО на самом терминале или на виртуальной машине под управлением Windows XP — очень плохая идея.
На XP нельзя запустить Buildagent TeamCity, в плейбуке Ansible такую машину настроить нельзя, контейнеров там тоже нет. Шаблонов виртуализации для Windows XP тоже не так уж и много.
В любой крупной компании, которая думает об информационной безопасности, машина с Windows XP будет находиться вдали от корпоративной сети или, тем более, домена.
То есть все взаимодействие с терминалом (или виртуальной машиной, притворяющейся таковой) должно происходить удаленно, а сам терминал должен иметь минимум стороннего ПО.
Решение
Некоторые люди удивляются, когда слышат об OpenSSH и Windows XP. В современных версиях ОС Microsoft поддержка SSH включена непосредственно в систему.В не очень современных (Windows 7) есть SSH-установщики с использованием PowerShell. С Windows XP ситуация немного хуже, но совсем немного.
Есть древняя версия установщика , который работает на нем без дополнительного программного обеспечения.
SSH — старый добрый надежный способ удаленного управления хостом, известная технология.
Нам нужно реализовать классы коннекторов SSH, которые могут выполнять несколько задач параллельно.
Например, скачать свежие логи с терминала онлайн, выполнить какие-то команды (копирование файлов, запуск скриптов, выдача прав, получение списка процессов, мониторинг системного времени терминала и т.д.).
Особенно интересен мониторинг системного времени.
Используя стандартные инструменты командной строки, Windows XP отображает время только в формате часов, минут, секунд и т. д., а не времени UNIX. Загвоздка, например, в том, что XP уже давно не получает обновлений часовых поясов, а наше российское правительство известно тем, что постоянно играет с отменой летнего или зимнего времени.
Например, стандартная Windows XP SP3 в московском часовом поясе показывает время на час раньше реального московского времени.
Соответственно, временные метки журналов терминала в любом случае не совпадают со временем на тестовой схеме.
Платежи-платежи-платежи.
Интерфейс терминала QIWI по сути представляет собой сеть, работающую на движке браузера, который обычно довольно старый.
Согласно протоколу веб-сокет он взаимодействует с MarATL, реальным программным обеспечением терминала.
При выборе платежа в терминале (например, оплата сотовой связи) с помощью ряда команд выбирается платежный провайдер, определяется размер комиссий и ограничений на прием банкнот, создается платеж под конкретного провайдера, который затем отправляется на обработку платежей через программное обеспечение терминала.
Взаимодействовать с веб-интерфейсом удаленно — не лучшая идея, тем более, что тестирование интерфейса — это другая задача.
Вы можете создать тестовую веб-страницу, которая будет размещаться во время тестов вместо стандартного index.html. Страница запускает JS-скрипт, который работает с программным обеспечением терминала, и, с другой стороны, создает клиент веб-сокета, который смотрит наружу, в сторону хоста, на котором выполняются тесты.
Что касается автотестирования, вам необходимо реализовать сервер веб-сокетов, который при запуске ожидает подключения клиента к терминалу и отправляет команды, которые в неизмененном виде пересылаются через тестовую страницу в программное обеспечение терминала.
Ответы программного обеспечения также отправляются на тестовый сервер веб-сокетов.
То есть набор команд для теста платежа можно описать в виде JSON, в котором последовательно описывается, какие команды нужно отправить и какого ответа от них ожидать.
Страница тестирования интерфейса.
Отображает команды, проходящие через него.
Где деньги?
Самая коварная техническая задача — имитация терминальной периферии.Принтер чеков моделируется тривиально; в ОС создается виртуальный принтер, печатающий данные в файл.
Вы можете получить этот чек (или его копию, сгенерированную самим программным обеспечением терминала) с терминала и расшифровать его, попутно проверив, например, что этот чек содержит все необходимые поля.
Сложнее обстоят дела с устройствами, принимающими деньги – купюро- и монетоприемниками.
Понятно, что если мы хотим протестировать сценарий оплаты, нам нужно как-то эмулировать наличие купюроприемника на терминале, поддерживать функционал приема купюр, их возврата, имитации различных проблем (например, возврата мятой купюры).
.
Большинство устройств приема денег работают по протоколу CashCode NET. Этот протокол определяет сценарии взаимодействия купюроприемника и контроллера (в нашем случае контроллером является наше терминальное программное обеспечение).
Пример взаимодействия контроллера и валидатора банкнот по протоколу CashCode. Через определенные промежутки времени контроллер запрашивает статусы устройств.
Минимальный размер команды CashCode — 6 байт. Описание команд можно найти в спецификации протокола CashCode NET.
Стандартный купюроприемник подключается к терминалу через COM-порт. Существуют сторонние утилиты, которые позволяют создать на машине виртуальный последовательный порт, например: ВСПЕ .
Поддерживаются даже сценарии переадресации для этого порта через TCP-соединение.
Наш случай проще, нам нужна тула, которая умеет подключаться к порту по WinAPI и имеет произвольный удобный интерфейс, например простейший stdin/stdout, который можно подключить по SSH. Тула в отдельном потоке общается с контроллером через последовательный порт и при необходимости моделирует ситуации, когда якобы поступают «деньги».
Также необходимо иметь некий пул тестовых аккаунтов или провайдеров, платежи по которым не будут обрабатываться по-настоящему, но в какой-то момент будут возвращены.
Либо, в более сложных случаях, деньги действительно проходят реальный процессинг, но попадают на специальные счета, с которых потом снова списываются для проверки платежа.
Это круговорот денег в природе.
Принтер чеков (вверху) и купюроприемник (внизу).
24/7
Программное обеспечение для терминалов и банкоматов должно быть предельно устойчивым к различным нештатным ситуациям - отсутствию Интернета, проблемам с купюроприемниками и т.п.Поскольку такое программное обеспечение запускается на терминале с очень высоким приоритетом и правами, оно по сути перехватывает все управление ОС.
Вы не можете просто свернуть его или закрыть с помощью Alt-F4. ПО умеет перезагружать себя и терминал, в т.ч.
В цикле.
Также необходимо проверить наличие подобных стрессовых сценариев, например, отсутствия связи с обработкой платежей.
Терминал реагирует на это периодической перезагрузкой; вам необходимо проверить, что он делает это правильно и каждый раз корректно загружает программное обеспечение терминала.
Установка с нуля и обновление
Установленное программное обеспечение терминала централизованно обновляется посредством обработки платежей.Обработка планирует обновление для конкретного терминала и определяет для него профиль обновления, то есть какие файлы и откуда нужно загрузить.
Для обновления необходимо выполнить ряд процедур в базе обработки, а затем провести мониторинг терминала.
Проверьте логи, что загрузка необходимых файлов началась, обновление успешно завершено и программное обеспечение терминала запущено и работает. Чистая установка с нуля сложнее.
Обычно человек делает это «в полях», просто копируя установочный файл на терминал и вписывая настройки и данные авторизации в формы установщика, который обычно представляет собой приложение WinAPI со стандартными контроллерами Windows (TextBox, CheckBox и т.п.
).
В наших автотестах для сценария чистой установки на терминал помещается скрипт Python, который запускает установщик, взаимодействует с контроллерами с помощью библиотеки pywinauto и записывает собственный журнал установки.
После завершения первого этапа установки скрипт завершается, а программное обеспечение терминала проходит авторизацию в обработке, получает путь к установочному профилю и загружает все необходимые файлы.
Здесь уже нужно мониторить логи на терминале в режиме реального времени через SSH. В него записываются все нештатные ситуации при установке (например, неправильные данные авторизации); вы должны прочитать эти журналы в Интернете и, при необходимости, считать, что тест чистой установки не прошёл.
Чистая установка с нуля MarATL
Заключение
Мы кратко рассмотрели основные технические аспекты создания автотестов терминального ПО.Не углубляясь в технологии, мы разобрали большую задачу на отдельные аспекты.
Задавайте вопросы в комментариях, если тема интересна, некоторые моменты можно подробнее осветить в отдельной статье.
Спасибо за внимание! Теги: #Финансы в ИТ #тестирование #java #Тестирование ИТ-систем #Старое оборудование #автоматизация тестирования #автоматизация тестирования #fintech #Qiwi #терминалы #поддержка старого оборудования
-
Дешевые Колонки
19 Oct, 24 -
Мобильный Программный Видеотелефон
19 Oct, 24 -
Адамово Яблоко
19 Oct, 24