Хабр, привет. То, о чем мы расскажем достаточно необычный опыт. Наверняка, многим будет интересно узнать, что мы создавали, а в особенности, как это тестировали. Ведь это сильно отличается от тестирования веба и мобильных приложений, т.к. необходимо иметь физический доступ к весам и периодически приезжать по заявкам пользователей или для теста прода. Мы разработали приложение для весов с сенсорным экраном, которые можно встретить в магазине в отделе с фруктами и овощами, куда вы кладете мешок яблок, набираете на экране номер товара, и они показывают вес и стоимость, а затем печатается ценник со штрих кодом. Попробовали сделать обычные весы умными, и вот, что из этого получилось.
Быстро пробежимся по оглавлению:
Из чего состоит тестируемое устройство.
Из чего состоит тестируемое приложение.
Как весы работают со стандартным приложением и как с нашим.
Что тестируем и как это будем тестировать.
Как установить образ с ПО на весы и настроить.
Как обновить ПО.
Поддержка приложения и какие специфические ситуации возникают при работе с весами.
Как перепрошить принтер.
Из чего состоит тестируемое устройство
Прежде чем начать тестировать устройство, давайте взглянем на него.
1. Весы DIGI RM-5800 в стандартной комплектации, состоят из нескольких частей:
Сенсорный экран. Нужен для отображения информации, а также для взаимодействия с этой информацией.
Весовая площадка. Нужно для того, чтобы узнавать вес товара.
Принтер этикеток. Печатает после взвешивания этикетки со штрих кодом, весом и стоимостью товара.
Wi-fi ресивер.
Также есть:
Кнопка вкл\выкл.;
2 USB-порта;
RJ-45.
2. Наша расширенная комплектация, которая позволяет сделать весы умными.
Блок с распознаванием.
Usb-провод для питания блока.
Usb-провод для передачи данных с блока на весы и обратно.
Камера подключается к блоку с распознаванием и фотографирует товары во время взвешивания.
С устройством весов разобрались. Теперь рассмотрим, что из себя представляет софт. Как во многих приложениях есть фронт, где происходит взаимодействие с пользователями и отображение графических элементов. Бэк, где хранятся товары и информация по цене и наличию определенных товаров в магазинах. И есть сервис, который выдает распознанные товары после того, как камера идентифицирует товар.
Как весы работают в стандартной комплектации
Покупатель берет весовой товар, например, фрукты\овощи, кладет на весы. В этот момент он видит вес товара. Осталось напечатать этикетку с ценой. Чтобы система поняла, что за товар на весах, покупателю необходимо пройти по одному из двух бизнес-сценариев:
Набрать номер товара на цифровом меню.
Либо перейти в список всех товаров, отсортированных по алфавиту, и найти свой товар в списке.
После одного из двух сценариев печатается этикетка, на которой есть:
Название товара;
Вес товара;
Цена товара;
PLU код товара;
EAN-13 штрих код (ШК).
Далее этикетка клеится на товар. На кассе или на кассе самообслуживания (КСО) сканируется ШК для идентификации товара и для последующей его оплаты.
Как весы работают в комплекте с блоком распознавания
Покупатель все также берет весовой товар, кладет его на весы. На этом моменте появляется другой бизнес-сценарий, в котором камера распознает продукт на весах и предлагает 5 максимально похожих товаров, из которых можем выбрать нужный. Камера делает снимок, обращается к блоку распознавания и с помощью обученной модели выдает нам до 5 похожих товаров. Заодно снимок отправляется на сервер для дообучения модели и улучшения качества распознавания. В этом бизнес-сценарии нам не нужно запоминать код товара и проваливаться в большой список с товарами. Они сразу отображаются на экране после того, как мы их положим.
Снизу на фото старт разработки, когда система еще не до конца обучена т.к. показывает помидоры, как огурцы, а бананы, как редис, но все же в выборке нужный товар присутствует.
С блоком распознавания есть еще один бизнес-сценарий:
В момент, когда мы выбираем товар предлагается распечатать релевантный скидочный купон. Это значит, что если положить 2 кг яблок на весы, система предложит распечатать купон именно на эти яблоки и напишет условия выполнения скидочного купона. Купон может, например, применяться начиная с 3 кг яблок. Это будет одно условие применения. На экране в момент показа релевантного купона есть выбор: печатать купон или нет. Если пользователь выбирает печать купона, то печатается сначала ценник с весом товара, а затем сам купон. Эффективность разных экранов с купонами тестировали с помощью A\B тестирования.
Что мы тестируем и как?
Весовая платформа.
Проверяем, что работает калибровка весовой платформы. В стандартной версии весовая платформа калибровалась вручную, а теперь же калибровка происходит в автоматическом режиме во время загрузки ПО. Поэтому убираем с платформы все лишнее и перезагружаем весы. После загрузки смотрим, что первоначальный вес отображается на экране 0.00 грамм.
Проверяем, что вес на самом деле правильно определяется. Для этого использовали смартфон, вес которого знали - 204 грамма. Кладем на весы предмет с известным весом и смотрим, что они правильно взвешивают.
Может ли быть отрицательный вес? Может. Такие случае происходили, когда во время калибровки на весах что-то лежало, это определялось как ноль, а после калибровки этот товар убирали. Поэтому важно, чтобы во время калибровки на весах ничего не лежало.
Легкое нажатие на весы. Изначально, этого не было в тест-кейсах, но после того как покупатели воспользовались весами, то обнаружилась очень интересная особенность. Из-за того, что UI отображает вес с небольшим опозданием, этого хватало, чтобы вес зависал на экране и больше не обновлялся. Происходило это, когда покупатели случайно задевали весовую платформу. Например, когда могли положить мешок на весы, а потом начинали его завязывать с находившимися внутри овощами. Добавили дополнительные проверки в коде на актуальный вес для UI. Теперь мы проверяем каждый раз этот сценарий на регрессе - нажимаем совсем чуть-чуть на весы и сразу отпускаем.
Распознавание товаров.
Проверяем, что распознавание работает. Кладем 1 товар на весы, система предлагает товары похожие на товар, который мы положили.
Распознавание нескольких товаров. Это наиболее встречаемая ситуация, и мы проверяем, что система предлагает похожие товары.
Товар под разным углом. Система обучается по фотографиям и каждый раз делает новое фото при размещении товара на весовой платформе.
Товары в полиэтиленовом мешке кладем на весы и смотрим, что никаких проблем с определением не возникает. Тоже наиболее распространенный сценарий.
Фасованные товары. Как правило, у них отличительная упаковка. Бананы, картофель или яблоки могут быть расфасованы и взвешены по сеткам заранее. Такие товары система тоже умеет определять.
Печать этикетки.
Автоматическая калибровка принтера. Ручной калибровки нет, поэтому проверяем, что тексты печатаются ровно, не заходят за края и штрих код отображается полностью на этикетке.
Лента с этикеткой может закончиться. Частая ситуация. В весах есть специальные датчики, которые сигнализируют в момент, когда лента заканчивается. Для нас важно обрабатывать команды от этого датчика и выводить на экран специальное сообщение
Проверяем поведение без ленты. Весы должны всегда показывать сообщение о том, что нужно заменить ленту и даже после перезагрузки.
Печать по несколько этикеток за раз. На весах бывает разная прошивка принтера, которая печатала по 4 этикетки вместо одной. Эта была проблема. И решить удалось только с помощью перепрошивки принтера на всех весах на одну версию. Как перепрошить принтер, описали ниже в отдельном разделе.
Юзабилити тестирование.
Cначала тестим удобство на наших сотрудниках. Говорим, что нужно воспользоваться весами по их прямому назначению. Смотрим, как они пользуются, где возникают трудности, куда нажимают. Также собираем устную обратную связь после использования. Правим дизайн, если где-то возникают сложности при использовании.
Тестируем на пользователях в магазинах. Выставляем весы в торговую зону около фруктов/овощей и начинаем наблюдать, как пользователи справляются с весами. Если видим, что возникают сложности, то точечно собираем обратную связь. Правим дизайны, выкатываем решение на большее количество магазинов.
A\B тестирование
Есть два бизнес-сценария. Мы еще не знаем, какой будет наиболее эффективный по печати скидочного купона, поэтому решили зарелизить оба сценария и показывать их пользователям 50\50. Т.е. в 50% случаев показываем пользователю 1 из бизнес-сценариев. Он начинается с момента, когда покупатель кладет товар на весы и заканчивается печатью этикетки и скидочного релевантного купона. Если вдруг на одном из сценариев пользователь не разберется как распечатать купон и уйдет на другие весы, то предусмотрена система сброса до начального состояния после 25 секунд бездействия.
Как установить и настроить образ с ПО на весы
Для того, чтобы установить свой софт на весы требуется физический доступ. Первоначальную установку по-другому не сделаешь. Можно было бы просто обновить стандартный софт, но такой возможности у него нет. Мы написали его полностью с нуля - это совершенно другой проект. Закачиваем софт на свой образ Linux и копируем на USB-накопитель.
Подготовка к установке нового образа
Все IP заранее определены и прописаны статически. Поэтому перед тем, как накатывать новую систему, мы должны записать сетевые настройки весов. Нам понадобятся IP адрес весов, маска подсети и IP шлюза. На стандартном ПО весов это делается через UI-интерфейс через админку. После этого подключаем клавиатуру к usb-порту. Мы готовы к установке и настройке нового образа с Linux, на котором есть наше ПО.
Раскатка образа на весы
Необходимо выключить весы, вставить туда usb-флешку с образом и включить их.
Во время загрузки нужно выйти в BIOS путем нажатия кнопки Del. Перейти в раздел Boot и в списке загрузочных устройств найти нашу загрузочную флешку и переставить её на первое место. Нажать F4 для сохранения настроек и выхода из BIOS - весы уйдут на перезагрузку.
-
После выбора устройства (сохранения и перезагрузки в случае выбора в BIOS) загрузится следующее окно:
Тут необходимо выбрать самый верхний пункт меню и нажать клавишу Enter. Произойдет процесс загрузки ПО. Далее запустится процесс восстановления из резервной копии. На данном этапе никаких действий со стороны пользователя не требуется. Перезагружаем систему после окончания установки.
Весы загрузят систему Linux с UI интерфейсом, а в ней сразу запустится новое ПО. Сделано это для того, чтобы каждый раз при перезагрузке\включении всегда включалось ПО для весов. Дальше нужно для ПО прописать сетевые настройки, чтобы произошла загрузка.
Настройка нового образа
-
Вводим команду sudo nano /etc/network/interfaces, откроется файл для редактирования. В нем добавляем сетевые настройки. Не забыть указать, что адрес статический static. Если будет dhcp, то ip будут автоматически выбираться из свободных, но у нас все ip заранее определены.
Итоговый вариант примерно выглядит так:
auto eth0
iface eth0 inet static
address 192.168.10.10
netmask 255.255.255.0
gateway 10.10.10.10
Меняем настройки до бэкофиса, чтобы ПО понимало, куда надо стучаться приложению и где брать актуальные данные. Вводим sudo nano /opt/scales/sls.conf. В открывшемся файле изменить IP адрес параметра backoffice.connection.url на соответствующий IP вашего бэкенда.
После перезагрузки данные по товарам и картинки загрузились. Установка и настройка произошла успешно.
Вот какие ещё команды при настройке могут быть использованы:
ping 192.168.10.10 - для проверки доступности сервера. Вместо 192.168.10.10 можете подставить IP своего сервера
sudo /etc/init.d/networking restart - для перезагрузки сетевых интерфейсов. Обычно нужно, чтобы после изменения файла /etc/network/interfaces не перезагружать весы. Выполняем команду, потом выполняем ping из п.1.
ip a - команда, чтобы посмотреть, что у сетевых интерфейсов поменялись ip адрес весов, маска сети, адрес шлюза. А также можно увидеть названия сетевых интерфейсов.
Обновление весов
Если для установки нам нужен был физический доступ к весам, то для обновления уже нет. В gitlab-ci закидывали все статические IP весов и по ним уже обновляли удаленно. По всей ритейл сети есть общая локальная сеть, поэтому все IP были уникальны внутри сети. И если какие-то из весов были недоступны или выключены,то мы об этом узнавали.
Процесс был построен так, мы обновляли сначала одни весы в магазине. Делали смоук тест функционала на этих весах. Далее обновляли все весы в одном магазине, их обычно от 2 до 4 шт., и также проверяли работу базовых функций. И после успешного тестирования, обновляли все весы во всех магазинах. Таким образом, мы снижали риск ошибиться.
Поддержка и специфичные баги
Один из важных этапов - это поддержка весов. Все ответственные в каждом магазине были добавлены в общий чат хотлайна, в котором мы могли в короткие сроки узнать о проблеме и решить её. Если удаленно решить не получается, либо не проблема не ясна, то оперативно выезжаем в магазин и смотрим на месте. Для выезда всегда с собой нужен ноутбук. Еще клавиатура и мышка для подключения к весам, на случай если понадобится откатывать версию, перепрошивать принтер или заходить в сетевые настройки. Далее опишем некоторые ситуации, которые оказались наиболее интересными.
Ситуация 1. Был обычный солнечный день и ничего не предвещало беды. В одном из магазинов произошел перебой в электричестве и после восстановления весы перестали загружаться, точнее перестал загружаться софт. Для загрузки софта нужен интернет, а значит возможные причины были понятны, но не тут то было. Софт мог загрузиться, а мог и нет. По приезду, после проверки настроек маршрутизации, все было в порядке. Пинг то проходил, то нет. Достаем ноутбук, смотрим, что же там с сетями. Нужные сети видно. Ок, пробуем подключиться. К сети подключается, но интернета нет. Хм, интересно, это на всех роутерах так?! Берем ноут, и начинаем ходить по магазину в поисках других сетевых точек, постоянно пингуем сервер. О, начал пинговаться! Идем обратно к весам, перестает проходить пинг. Ладно, причина ясна. На одном из роутеров сбились настройки, либо он просто завис. Надо делать заявку на админов.
Ситуация 2. Сообщение в чате поддержки от одного магазина: “У нас печатаются этикетки по несколько штук.” Спросили у других, у них все нормально и на тестах мы такого случая не ловили. По приезду начали разбираться. 1 гипотеза: может неправильно вставили ленту или калибровка принтера не прошла. Нет, вроде всё ок. 2 гипотеза: может на стандартном ПО у них также было и принтер печатал сразу несколько этикеток. Попробовали поставить его обратно, печатает нормально. Гипотеза не подтвердилась. Обратились к производителю весов. Он посоветовал изменить прошивку принтера, потому что на разных весах она разная и ведёт себя по-разному. Пофиксить это проблематично, потому что весы находятся с этой прошивкой в одном городе, а разработка ведётся на весах в другом. Мы пошли по более простому пути и меняли прошивку принтера.
Ситуация 3. Иногда в магазинах, вырывался кабель питания для блока распознавания, поскольку он висел со стороны, где больше люди ходят. Приходилось прятать его, либо сильнее закреплять, либо размещать стойку с весами так, чтобы не было соблазна забрать с собой кабель. Это помогло.
Изменение прошивки принтера
Для перепрошивки принтера на весах использовали программу CuteCom.
Установить можно самый новый билд sudo apt install cutecom, но с ним на некоторых весах были сложности, когда нельзя менять поле Device вручную и только из выпадающего списка (возможно в новых версиях это исправлено). На всякий случай версия, который пользовались мы, в интернете её можно спокойно найти cutecom_0.22.0-2_amd64.deb.
Как установили CuteCom нам нужен файл с прошивкой в формате file.bin. Его мы запрашивали у компании, которая предоставила нам весы и занимается сервисным обслуживанием их стандартной версией. Скидываем на флешку file.bin и вставляем её весы. Дополнительно нужно примонтировать флешку в системе командами:
sudo lsblk
sudo mkdir /media/usb
sudo mount /dev/sdb1 /media/usb
Принтер передавал команды через /dev/tty45, поэтому было жизненно важно изменять вручную поле device в cutecom. Чтобы найти активный tty достаточно выполнить команду ls /dev/tty*
Осталось только установить прошивку на принтер. Вбиваем в поле device /dev/tty45 нажимаем Open device, находим прошивку file.bin на usb-флешке в /media/usb. Появляется сообщение “SUCCEED.\0x00” в программе, которое свидетельствует о том, что прошивка успешно установлена. Перезагружаем весы.
Выводы
Таким образом, мы разобрались, как устроены весы, как их тестировали, какие были баги и что делать в случае, если что-то пошло не так. А еще посмотрели, как накатывать ПО и перепрошивать принтер. Это был интересный опыт, с таким не часто в тестировании встретишься и тут своя специфика, но так или иначе, теория тестирования применима везде, как бы это очевидно не звучало. Надеюсь наш опыт будет полезен и вы сможете применить его на своих проектах. А если получится, то обязательно дайте знать :)