Автор: Dali Intelligent Technology Team - QA Laohu
бизнес фон
Интеллектуальный рабочий свет Dali имеет интеллектуальную конструкцию с двумя камерами, которая может помочь родителям удаленно обучать своих детей домашнему заданию, даже когда их нет дома.Инновационная форма настольной лампы в сочетании с умными глазами Дали специально разработана для сцен работы детей за столом, реализуя интеллектуальное распознавание и объяснение, а также помощь детям в повышении эффективности работы. Его также можно связать с родительским приложением «Deliver Guidance», чтобы синхронизировать ситуацию обучения в режиме реального времени, создавая сбалансированные и приятные отношения обучения и репетиторства для учащихся и родителей.
особенности продукта
умное оборудование | Традиционное мобильное приложение | |
---|---|---|
тестируемый объект | умное оборудование Интеллектуальное оборудование + мобильный телефон (родительская сторона) взаимодействие Интеллектуальное оборудование + компьютер (на стороне учителя) взаимодействие |
Обычно мобильное приложение |
Вход | Голосовой ввод ввод жестами Ввод изображения (быстрый поиск/нажмите, чтобы прочитать) Распознавание голосовых отпечатков |
Нажмите, чтобы скользить |
Отсутствует стоимость теста | Отзыв оборудования обходится очень дорого | Решение для оперативного исправления |
проблемы с производительностью | Обратите внимание на память/процессор/частоту кадров самого приложения. Обратите внимание на оставшуюся память/процессор/температуру процессора системы. Обратите внимание на оставшееся дисковое пространство системы |
Просто сосредоточьтесь на самом приложении приоритет не слишком высок |
Трудности функционального тестирования
- Проблемы с обслуживанием дел, вызванные быстрыми изменениями в бизнесе
- Из-за быстрого изменения бизнеса и высокой частоты изменений интерфейса текущая проверка интерфейса является относительно строгой, что оказывает большое давление на поддержание старого дела.
- Мультимодальный ввод
- Традиционный автоматизированный тест заключается в имитации нажатия кнопки пользователем. А еще нам нужно обработать данные голосового ввода и подготовить бумагу для съемки устройством.
- поддержание окружающей среды
- Благодаря голосовому вводу окружающая среда не требует шума, и несколько устройств не могут быть размещены в одном месте.
- Обновление технологий и рефакторинг программного обеспечения
- Текущее приложение использует webview, flutter, lynx и другие технологии для рендеринга страниц, и элементы этих страниц нельзя получить нативными методами.
- Обнаружение нескольких приложений и нескольких терминалов
- Поскольку содержанием проекта является взаимодействие между несколькими приложениями, проверку работы необходимо синхронизировать на интеллектуальном оборудовании и мобильном телефоне, что сложнее.
- На интеллектуальном оборудовании работает несколько приложений, и вам нужно переключаться между приложениями во время тестирования. Так что это вносит сложности в конструкцию рамы.
Текущий заработок:
Платформа автоматизации Shoots компании очень мощная и мощная. Но при фактическом использовании Shoots в сочетании с реальными потребностями бизнеса мы считаем, что автоматизация пользовательского интерфейса также должна иметь следующие возможности:
- Обогатите методы тестирования, улучшите способность находить больше проблем
- Снизить затраты на написание вариантов использования
- Сокращение затрат на использование результатов тестирования
- Один код может быть совместим с несколькими версиями теста, чтобы можно было проводить проверку ветвей и проводить предварительное тестирование.
- Возможность собирать «непредсказуемые человеком» данные для регистрации ошибок
Общий обзор
Вся структура поддерживается вокруг следующих основных функциональных точек
- Обогатите методы тестирования, улучшите способность находить больше проблем
- Снизить затраты на написание вариантов использования
- Сократите затраты на использование результатов тестирования, отслеживайте данные и статистику, а также оценивайте тенденции
- Один код может быть совместим с несколькими версиями теста, чтобы можно было проводить проверку ветвей и проводить предварительное тестирование.
- Возможность собирать «непредсказуемые человеком» данные для регистрации ошибок
Написание вариантов использования: снижение затрат
Автоматическая генерация скрипта
Написание традиционных побегов:
Окно в красном поле должно быть названо, и соответствующий метод также должен иметь соответствующее имя функции. Эти результаты на самом деле не могут быть получены автоматически.
Ниже приведен пример автоматически сгенерированного кода: имя класса напрямую деградирует до соответствующего китайского имени (введенного вручную в процессе записи), а соответствующий щелчок функции также будет в виде имени идентификатора + текстовой аннотации.дается автоматически.
def auto(self):
self.wait(5)
self.step("开始复现脚本,请尽快重命名") #todo 需要重命名
if not self.checkEnterWin('主界面'): return False
self.touchOcrKey('作业批改')
if not self.checkEnterWin('拍照\_主界面'): return False
self.tapKey('单题搜')
self.tapKey('take\_photo') # text = 单题搜
if not self.checkEnterWin('拍照框题页'): return False
self.tapKey('cropper\_iv\_retake') # text = 整页检查
if not self.checkEnterWin('拍照\_主界面'): return False
self.tapKey('iv\_flashlight') # text = 补光
self.tapKey('iv\_flashlight') # text = 补光
self.tapKey('iv\_close')
if not self.checkEnterWin('主界面'): return False
return True
Автоматически создавать снимки страниц
модульная конструкция корпуса
Когда мы напишем больше вариантов использования, мы обнаружим, что многие логические операции на самом деле являются атомарными операциями или часто используются группы операций. Если мы позволим ему существовать в нескольких местах, как только произойдут изменения в требованиях или возникнет проблема со сценарием, нам придется везде тушить пожары. И стоимость написания кейса тоже увеличится. Исходя из этого соображения, мы предлагаемАтомарный набор операцийСпособность.
Требуется, чтобы каждая группа операций могла быть названа соответствующим образом, и место не было бы слишком длинным.
пользовательское удаление всплывающих окон
Теперь из-за различных рекомендаций + push, некоторые окна битов рекомендаций будут бесконтрольно появляться в различных сценариях. И с этими окнами очень трудно иметь дело.
На основе этого явления здесь специально производится оптимизация, и в каждой ссылке обрабатывается рекомендуемое битовое окно.
POP\_WINDOWS = {
#'学生端\_坐姿检测\_结果' : \['bt\_pose\_debug'\],
#'学生端\_坐姿检测\_结果' : \['btn\_start', 2, 'KEYCODE\_BACK', 1, 'bt\_pose\_debug', 1\],
'学生端\_坐姿检测\_结果' : \['btn\_start\_finish', 1, 'KEYCODE\_BACK', 0.5\],
'学生端\_作业模式\_作业提醒' : \['iv\_close', 1\],
'学生端\_准备升级' : \['update\_reboot\_later', 1\],
'学生端\_作业开始提示' : \['iv\_close', 1\],
'勋章\_获得' : \[\[320, 1300\], 1\],
}
def dealWithPopWindows(self, win):
popWindows = self.getPopWindows()
if popWindows == None or len(popWindows) == 0: return win
for k,v in popWindows.items():
if window\_manager().isWindow(win, k):
for item in v:
if type(item) == int or type(item) == float:
self.wait(item)
elif type(item) == list and len(item) == 2:
self.mainDevice().touch(item)
elif item.startswith('KEYCODE'):
Log.warning("发现Pop窗口\[{}\],尝试通过按Key \[{}\]关闭".format(k, item))
self.mainDevice().keyEvent(item)
else:
Log.warning("发现Pop窗口\[{}\],尝试通过按键\[{}\]关闭".format(k, item))
win.clickItem(item)
self.wait(1)
# 这里必须用递归,因为存在这样的场景。假定循环顺序是ABCD,C处理完了变成A了,但是A已经循环过了.还有一种情况就是点击按钮并没有成功关闭,那么用递归也能重复检测这个界面。所以用递归重新循环会更保险
return self.dealWithPopWindows(self.refreshWin())
return win
То есть при написании кода вам нужно только определить файл информации всплывающего окна и метод выхода в константах (поддерживающий многошаговый выход), и вам не нужно учитывать эти детали при написании кода, потому что все из них упакованы.
Написание прецедентов: обогащающие средства для поиска большего количества проблем
Автоматически рекомендовать элементы проверки страницы
Подобно дереву Response json на стороне сервера, страница отображения Android также представляет собой древовидную структуру представления. Следовательно, как и проверка результатов на стороне сервера, проверка страницы также является проверкой дерева страниц.
Идея состоит в том, чтобы оценить значение каждого узла дерева страниц. В android есть контейнер View, ButtonView, TextView. Согласно бизнес-опыту, мы обычно уделяем больше внимания ButtonView (свойство кликабельно) и TextView (имеет ли оно свойство text). В представлении контейнера, если это ListView или RecycleView, мы сделаем вывод, генерируется ли он в режиме реального времени, оценивая, является ли ViewID внутри одинаковым. Если он генерируется в режиме реального времени, значение проверки очень слабое.
Точно так же мы также будем судить о том, имеет ли узел значение проверки, исходя из размера области отображения. Представления, область отображения которых слишком велика или слишком мала, имеют очень низкую ценность для проверки.
Поиск изображения/текстовый поиск
Поддерживает обнаружение существования ключевых слов (можно выполнять несколько проверок одновременно, поддерживается нечеткое соответствие).
Вы также можете нажать напрямую:
Вы также можете попробовать его в течение определенного периода времени для сценариев, в которых время загрузки страницы не определено.
Совместная работа на нескольких устройствах
Компоненты поддерживают несколько устройств
Практическое применение в случае
Воспроизведение аудио/запись/запись видео
с помощьюВспомогательное оборудованиеСпособность
- Воспроизвести звук (голосовой тест)
- Запись видео (схема кадрирования видео)
- Запись (путем обнаружения ряби, чтобы определить, есть ли реальный звук, и через asr, чтобы определить, соответствует ли звук ожиданиям)
Внедрение/моделирование трансляции аудиофайлов Mock
Оба требуют сотрудничества в исследованиях и разработках, что может снизить зависимость от окружающей среды. Этапы, которые мы проходим в отношении аудиотестирования:
- Воспроизведение MAC
- Вспомогательное машинное воспроизведение
Поскольку компьютер не может воспроизводить звук после байта, для воспроизведения звука можно использовать только вспомогательную машину. Недостатком является то, что это очень дорого для окружающей среды и требует звукоизоляционного оборудования. В настоящее время этот режим полностью не устранен, потому что если вы хотите сымитировать реальную сцену, вам придется воспроизводить звук вспомогательной машины.
- аналоговое вещание
лучший способ. С широковещательным текстом транслируемый текст эквивалентен (текстовый результат речи asr). Недостаток в том, что с реальным бизнес-процессом все же есть некоторый разрыв, что приведет к потере некоторых скрытых точек. Требуется сотрудничество в области НИОКР.
- Вставка аудиофайлов
Заполните непосредственно голосовыми файлами, и процесс в основном соответствует реальной сцене. Это также требует сотрудничества в области НИОКР.
Макет изображения
Мы начали с вспомогательного устройства (PAD) для размещения карты. Но последующий эффект не очень хороший, поэтому вместо этого используйте бумагу. Однако бумагу нельзя переключать динамически.В конце концов, мы договорились с R&D о фиктивном решении, которое может напрямую использовать файлы, которые мы отправляем, для имитации результата фотографии.
Обслуживание обновлений прецедентов
Автоматически совместим с экспериментами AB
Изменения в логике перехода на страницу.
Версия A: A->B->C->D
Версия B: A->B->D
Если вы хотите запускать сценарии автоматизации в нескольких версиях, вы должны быть совместимы с различиями процессов.
Точно так же, если вам нужно выполнить тесты AB, пока вы настраиваете соответствующую информацию о странице, вы также можете сделать это с помощью кода.
решенная проблема:
1: Решите тест AB
План А:
entrance -> service_ui_A -> service_ui_A_1 -> end_page
План б:
entrance -> service_ui_B -> service_ui_B_1 -> service_ui_B_2 -> end_page
if helper.judgeAndAction({
'entrance' : lambda win: helper.tapKey('enter'),
'service\_ui\_A' : lambda win: helper.tapKey('enter\_a'),
'service\_ui\_A\_1' : lambda win: helper.tapKey('enter\_a1'),
'service\_ui\_B' : lambda win: helper.tapKey('enter\_b'),
'service\_ui\_B\_1' : lambda win: helper.tapKey('enter\_b1'),
'service\_ui\_B\_2' : lambda win: helper.tapKey('enter\_b2'),
'end\_page' : None, #出口页面
}, '切换到主界面', timeToWait=20, timeWaitPerTime=0.5, actionWhenNoMatch=lambda: exitPage(helper)):
2: После выполнения задания на некоторых страницах будет отображаться, что вы получили медаль XX. Но получается не каждый раз, так что в этот раз надо
if not self.judgeAndAction({
'勋章\_获得' : lambda win: self.tapKey('submit'),
'作业模式\_全部完成' : None,
}, '完成所有作业'): return False
3: Некоторые страницы результатов зависят как от внешних носителей, так и от внутренних алгоритмов. Например, инспекционная работа, содержание инспекции может быть узнаваемым или нет. На этом этапе необходимо перечислить и обработать возможные страницы результатов.
return self.judgeAndAction({
'检查作业\_无法检查' : lambda win: self.tapKey('btn\_right'),
'检查作业\_有结果' : lambda win: self.tapKey('btn\_right'),
'检查作业\_对答案中': lambda win: self.tapKey('btn\_right'),
'检查作业\_全对' : lambda win: self.tapKey('homework\_close'),
'检查作业\_对答案\_结束': lambda win: self.tapKey('homework\_correct\_close'),
#'检查作业\_对答案\_结束\_225': lambda win: self.tapKey('homework\_correct\_close'),
'检查作业\_对答案\_计算题' : lambda win: self.tapKey('btn\_next'),
'Launcher\_下半部': None,
'Launcher' : None,
}, '检查作业', timeToWait = 60)
4: Чтобы вернуться к определенному интерфейсу. Затем попробуйте вернуться на новую страницу, определив actionWhenNoMatch
Например, следующий пример — вернуться к основному интерфейсу из любого интерфейса, непрерывно нажимая известную кнопку выхода.
if helper.judgeAndAction({
'Launcher' : lambda win: swipe\_X(helper.mainDevice(), False),
'Launcher\_下半部' : lambda win: swipe\_X(helper.mainDevice(), False),
'学生端\_夜间模式': lambda win: dealWithNightMode(helper, win),
'主界面\_个人定制' : lambda win: swipe\_X(helper.mainDevice(), True),
'学生端\_视频通话\_对话简约': lambda win: helper.tapKey('control\_container'),
'学生端\_视频通话\_对话中': lambda win: helper.tapKey('buttonCallCancel'),
'学生端\_主界面' : None,
}, '切换到主界面', timeToWait=20, timeWaitPerTime=0.5, actionWhenNoMatch=lambda: exitPage(helper)):
На телефоне это еще проще, просто нажмите кнопку «Назад», и все готово.
def backToMain(helper):
return helper.judgeAndAction({
'主界面': None,
'主界面\_神灯\_已登录': lambda win: helper.tapKey('首页'),
'主界面\_我的\_未登录': lambda win: helper.tapKey('首页'),
'主界面\_我的\_已登录': lambda win: helper.tapKey('首页'),
'主页面\_学情': lambda win: helper.tapKey('首页'),
'家长端\_视频通话\_确认类型': lambda win: helper.tapKey('plugin\_tv\_cancel'),
'家长端\_视频通话\_主叫': lambda win: helper.tapKey('tvCancelBtn'),
'家长端\_视频通话\_来电': lambda win: helper.tapKey('tvRefuseBtn'),
}, '回到家长端主页',
actionWhenNoMatch=lambda: helper.mainDevice().press\_back()
)
Совместимость с несколькими версиями страниц
Проще говоря, вы можете написать несколько окон, а затем автоматически подобрать наиболее подходящее во время выполнения.
При выполнении любого [одностраничного/многостраничного]чекПосле этого он попытается привязать страницу к соответствующему номеру версии.
Использование результата варианта использования
Вывод отчета о различиях текущей страницы и ожидаемого снимка страницы
Определить, соответствует ли текущая страница историческому снимку страницы
Когда наш вариант использования дает сбой, с нативными побегами, мы можем только знать, какой ключ не сработал. На самом деле, если мы хотим автоматическую атрибуцию, или иметь больше информации при анализе, то нам очень захочется знать, какая страница находится в данный момент.
Конечно, мы также можем получить текущую страницу через скриншот ошибки, но иногда страница такая же, как мы думаем, но соответствующие кнопки могут отсутствовать или имя было изменено, что создаст трудности для нашего позиционирования.
Подводя итог, нам нужно вывести при отказеДополнительная информациячтобы помочь нампроблема позиционированияиАвтоматическая атрибуция.
Здесь указано несколько результатов, ранжированных от высокого до низкого соответствия. Таким образом, окончательно определяется, что текущая страница является студенческим side_main interface_255.
Автоматическая генерация анализа ошибок / автоматическое открытие ошибок
Чтобы снизить трудозатраты на потребление результата, мы максимально стараемся использовать автоматическое потребление. Мы будем использовать регистр + шаг + причина ошибки + текущая страница + (ожидаемая страница | ключ | ожидаемый текст, распознаваемый изображением) и т. д., чтобы сгенерировать основную причину ошибки.
Используйте эту основную причину ошибки, чтобы автоматически атрибутировать результаты. Если ключевое слово совпадает с упомянутым ранее, оно автоматически приписывается [повторяющейся ошибке]. Кроме того, прилагается статус текущей неисправности. Если время, на которое следует обратить внимание, было разрешено, оно соответствует объединенной ветви.
Неудачное восстановление сцены
В случае сбоя варианта использования собирается достаточно информации для достижения 99-процентного восстановления сценария сбоя.
- скриншоты каждого шага
- Операция процесса (кнопка нажата, страница проверена, реальные координаты нажатого распознавания изображения)
- Направленные журналы, необходимые для удаленного доступа
- Системный журнал и журнал уровня ошибок во время процесса
Так что, как только есть проблема, нам не нужно смотреть на нее сразу, и требования к потреблению в реальном времени не высоки, чтобы не прерывать ритм работы НИОКР и тестирования.
система сбора логов
Настройте ключевые слова журнала + выходные файлы. Журналы автоматически собираются во время теста.
Ключ — это имя файла, а значение — это ключевое слово. Поддерживается несколько ключевых слов. Пока любое из них совпадает, оно будет записано.
Это в основном используется для специальных проблем расследования и сбора ошибок StrictMode, которые будут упомянуты позже.
Автоматическая диагностика
В настоящее время автоматическая диагностика выполняется в различных формах.
- плагин
-
Обнаружение вариантов использования во время выполнения
-
Тестирование по результатам тестирования
Обычно это определяется по логу. Это может быть от Shoots или это может быть заказ.
Результаты потребления измеримы
Согласуйте стандарты потребления с одноклассниками, которые потребляют результаты. Время обработки указывается в процессе потребления, так как обработка только что завершилась, погрешность оценки времени теоретически мала. Таким образом, после запуска в течение определенного периода времени вы можете увидеть сведения о времени использования результатов теста во всем процессе.
В отрасли считают, что окупаемость автоматизации пользовательского интерфейса очень низкая, а у студентов, изучающих бизнес, плохое чувство тела. Так каков реальный эффект? Вывод этих данных фактически представляет собой когнитивную коррекцию традиционной концепции, а также предоставляет точные данные для оценки автоматизированной рентабельности инвестиций. Благодаря этим отчетам мы можем точно измерить потребление результатов тестирования, стоимость обновления скриптов в связи с изменениями в исследованиях и разработках и стоимость незавершенных скриптов, что нам удобно для расчета реальной выгоды от автоматизации клиента.
Если результаты теста не будут использованы вовремя, будет сигнал тревоги
Тестовый левый сдвиг
Инспекция филиала
Предварительно тест! Фронт! Вперед снова!
После того, как R&D вытаскивает ветку, она начинает упаковывать для автоматического тестирования. Впоследствии, как только в R&D будут внесены изменения, мы упакуем и протестируем, когда обнаружим, что информация о коммите GIT изменилась. При такой операции мы знаем о качестве ветки и можем упреждать риски.
Искусственно непредсказуемый
сбор данных о производительности
Он будет собирать данные о производительности на этапе тестирования и автоматически определять, есть ли утечка памяти или предупреждать о некоторых пороговых значениях.
Принятие алгоритма
Есть некоторые алгоритмические изменения, которые требуют сквозного принятия стресса. На этом этапе необходимо использовать предыдущие возможности макета изображения/аудио для переключения протестированных ресурсов, а затем выполнить тест для достижения эффекта приемки.
перспективы на будущее
Автоматизацию пользовательского интерфейса все еще трудно полностью не протестировать. Кроме того, исследования и разработки изменили страницу, и тест должен быть продолжен. Трудно быть по-настоящему адаптивным. Я лично считаю, что развитие автоматизации пользовательского интерфейса в будущем будет продолжаться по двум направлениям:
1,Уточнение проверки пользовательского интерфейса
Большую часть работы можно заменить выборкой элементов управления пользовательского интерфейса + снимками экрана + памятью макета + искусственным утверждением.
2,Интеллектуальный обход + автоматическое утверждение
Календарь всех элементов управления пользовательского интерфейса, включая новые страницы. Может выполнять автоматическое утверждение, автоматически определять проблемы для отправки на проверку вручную.
Горячий трюк
В настоящее время ведется набор на следующие должности:Инженер по разработке тестов (старший)