Русский
Русский
English
Статистика
Реклама

Блог компании юла

Конечные автоматы на страже порядка

26.11.2020 12:17:06 | Автор: admin


При разработке сложных систем часто сталкиваешься с проблемой прозрачности кода, точным описанием бизнес-логики и масштабирования решения. Однажды нам поставили задачу: реализовать функциональность тарифов, в которой много бизнес-логики. При этом сроки были сжаты, да ещё и повышенные финансовые риски. Чтобы решить эту задачу быстро, эффективно и прозрачно, мы решили использовать конечные автоматы (state machine).

Суть задачи


Тариф в Юле это набор платных опций по размещению и продвижению объявлений. Они дают пользователям дополнительные преимущества, вроде расширенного личного кабинета в веб-версии сервиса, использования раздела портфолио и прочего.

Также у нас есть понятие пакета платный набор из определённого количества размещений объявлений. Удельно получается дешевле, чем когда оплачиваешь размещения разово.

Бизнес попросил добавить в мобильное приложение возможность всячески редактировать услугу тарифов. Продакт-менеджеры придумали очень крутую и гибкую схему логики, под которую пришлось бы сделать очень много экранов и переходов. Вот лишь четверть всей схемы, это только редактирование, а есть ещё создание, оплата, планирование и так далее.



Естественно, мы заподозрили, что решение получится очень громоздким. Например, с тарифами задача подразумевала 7 полноценных экранов, массу различных диалогов и уведомлений. От сервера необходимо было сразу получать определенные данные. К этому добавилась и обработка различных состояний доступности редактирования выбранных значений; предвыбранные значения, которые нам приходят с сервера; возможность выбирать значения только на увеличение (речь о возможности запланировать тариф с большими значениями относительно текущих настроек тарифа). И многое другое. С пакетами была похожая картина, но меньше масштабом.

К тому же было еще два небольших условия от бизнеса:

  • Дедлайны близко.
  • Решение точно будет расширяться. Когда мы приступали к разработке, еще не было В2В-сегмента. Но мы знали, что он появится, и расширяться будет очень интенсивно.

Естественно, переписывать времени не будет, потому что решение должно быть лёгким в сопровождении.

Выбор решения


Первый вариант самый очевидный: флаги. Их можно описать очень много. Например, вот небольшое условие, которое отображает шапку тарифа:

if (hasTariff) {if (hasErrorTariff) {           // Ошибка оплаты тарифа} else if (isProcessedTariff) {           // тариф ожидает оплаты} else {           //тариф активен}} else {//нет тарифа}

Увы, такой вариант тяжело расширять. Когда добавится новое условие, придётся ветвить схему еще сильнее.

Второй вариант: добавление переменных с состояниями. На их основе можно решать, что отрисовывать. Но такому способу не хватает гибкости.

enum class State {PROCESS, ERROR, ACTIVE}when (state) {   PROCESS -> // тариф ожидает оплаты   ERROR -> // Ошибка оплаты тарифа   ACTIVE -> //тариф активен}

Третий вариант: найти что-то более описываемое, понятное и масштабируемое. Конечно же, это конечные автоматы (машины состояний).

Конечный автомат это модель дискретного устройства, которое имеет в себе определенный набор правил, обычно один вход и один выход. И в каждый момент времени автомат находится в одном состоянии из множества описанных. У автомата есть API, по которому можно переключить состояние, и если это некорректное переключение, то мы узнаем об ошибке. Следуя этой концепции очень легко структурировать код и сделать его читаемым. Такой код проще отлаживать и контролировать на всех этапах. Простенький конечный автомат может выглядеть так, и его очень легко расширять:


Конечные автоматы


Конечные автоматы прекрасно помогают в реализации бизнес-логики. Ведь мы точно описываем поведение системы при любом событии. Поэтому мы решили использовать этот подход. Описали нашу схему:


В ней можно иногда запутаться, однако всё, что было необходимо на момент реализации, здесь есть. Но нарисовав эту схему, мы поняли, что всё-таки надо понять, что и как мы будем реализовывать.

Есть несколько вариантов. Первый: пишем всё сами. Второй: берём одну из своих старых узкоспециализированных реализаций и дорабатываем. И третий вариант: используем готовое решение.

У самописного решения есть очевидные достоинства и недостатки. К первым относится лёгкость изменения и язык Kotlin. Правда, на разработку требуется немало времени. К тому же могут быть баги, которые придётся исправлять.

Начали смотреть на сторонние решения. Сначала выбрали библиотеку Polidea. Но у неё оказалось довольно много недостатков на наш взгляд: она написана на Java, имеет проблемы с поддержкой и трудно дорабатывается.

Тогда мы обратили внимание на библиотеку Tinder. Достоинств у неё оказалось больше, чем недостатков, что и сыграло позднее в её пользу. Она написана на Kotlin, у неё удобная DSL, библиотеку регулярно обновляют. А её главный недостаток трудно дорабатывается. Но всё же мы остановились на Tinder.

Библиотека Tinder


Код библиотеки:

val stateMachine = StateMachine.create<State, Event, SideEffect> {    initialState(State.Solid)    state<State.Solid> {        on<Event.OnMelted> {            transitionTo(State.Liquid, SideEffect.LogMelted)        }    }    state<State.Liquid> {        on<Event.OnFroze> {            transitionTo(State.Solid, SideEffect.LogFrozen)        }        on<Event.OnVaporized> {            transitionTo(State.Gas, SideEffect.LogVaporized)        }    }    state<State.Gas> {        on<Event.OnCondensed> {            transitionTo(State.Liquid, SideEffect.LogCondensed)        }    }    onTransition {        val validTransition = it as? StateMachine.Transition.Valid ?: return@onTransition        when (validTransition.sideEffect) {            SideEffect.LogMelted -> logger.log(ON_MELTED_MESSAGE)            SideEffect.LogFrozen -> logger.log(ON_FROZEN_MESSAGE)            SideEffect.LogVaporized -> logger.log(ON_VAPORIZED_MESSAGE)            SideEffect.LogCondensed -> logger.log(ON_CONDENSED_MESSAGE)        }    }}

Здесь есть состояния, в которых можно хранить какие-то данные, если, например, надо переходить с какими-то условиями. Также есть различные события, на которые мы можем реагировать: в данном случае OnFroze. SideEffect мы не использовали, не понадобилось.

Состояния переключаются просто: передаём в Transition объекта stateMachine событие, которое хотим отправить. В stateMachine есть описание всех возможных состояний. А внутри них мы можем описать те события, которые могут произойти.

Также в библиотеке есть важная конструкция OnTransition. В ней можно определить, из какого состояния в какое мы перешли, и определить корректность перехода. Мы использовали эту конструкцию, и при некорректных событиях просто выбрасывали пользователя в начало, чтобы он заново прошел по всему пути.

Реализация


Чтобы реализовать нашу бизнес-логику, кроме состояний нужно было описать и данные. Мы решили использовать один объект, который станет постепенно заполняться, пока пользователь идет по конечному автомату. В объекте есть набор параметров, либо влияющих на часть нашей функциональности, либо отражающих предустановку каких-то данных, либо содержащих какие-то вспомогательные данные.

По мере реализации схема разрослась: получилось около 30 состояний и 100 переходов. И поскольку всё содержалось в одном файле, ориентироваться стало довольно сложно. А искать баги ещё тяжелее, потому что когда из одного состояния перешел в другое, то появились какие-то данные и не можешь понять, в чём проблема.

На помощь пришла декомпозиция. Раз мы смогли сделать один конечный автомат, то сможем сделать ещё. Так мы из одного автомата сделали шесть.


С одной стороны, кажется, что мы увеличили себе работу. С другой стороны, мы стали лучше ориентироваться в коде. Стали понимать бизнес-схему и логику нашего приложения. Всё стало проще.

class TariffFlowStateMachine constructor(       val selectedStateMachine: TariffSelectedStateMachine,       val presetStateMachine: TariffPresetStateMachine,       val packageStateMachine: TariffPackageStateMachine,       val tariffStateMachine: TariffStateMachine,       val paymentStateMachine: TariffPaymentStateMachine) {   private val initialState = State.Init      val state: State       get() = when (stateMachine.state) {           is State.RootsState.RootSelectedState -> selectedStateMachine.state           is State.RootsState.RootPresetState -> presetStateMachine.state           is State.RootsState.RootPackageState -> packageStateMachine.state           is State.RootsState.RootTariffState -> tariffStateMachine.state           is State.RootsState.RootPaymentState -> paymentStateMachine.state           else -> State.Init   }

У нас есть базовый автомат, который управляет несколькими маленькими. Каждый из них отвечает за свой фрагмент функциональности. И когда продакт-менеджеры просят добавить что-то ещё, нам не приходится менять все переходы большого автомата. Достаточно поменять один маленький.

Например, так выглядит автомат выбора данных:


Автомат сборки пакета:


Автомат сборки тарифа:


А это автомат оплаты:


Приятный бонус


Кроме лёгкости расширения модульные конечные автоматы сильно упростили нам тестирование. Чтобы начать покрывать их тестами, можно написать небольшие обёртки, позволяющие указать начальное состояние, переход и ожидаемое состояние. Пример теста:

stateMachine = flowStateMachine.stateMachinestateFlowable = flowStateMachine.stateMachine.state//region utilityprivate fun assertTransition(initial: State, event: Event, expected: State) {  //given  val stateMachine = givenStateIs(initial)  val stateSubscriber = stateFlowable.test()  //when  stateMachine.transition(event)  //assert  stateSubscriber.assertLast(expected)}private fun givenStateIs(state: State): StateMachine<State, Event, SideEffect> {  return stateMachine.with { initialState(state) }}private fun TestSubscriber<State>.assertLast(expected: State) {  this.assertValueAt(this.valueCount() - 1, expected)}@Testfun `given state PaidPromotion on Error should result in PaymentMethods`() {  assertTransition(        initial = State.PaidPromotion(paymentMethod = PaymentMethod.CARD),        event = Event.Error(),        expected = State.PaymentMethods(navigateBack = true, reload = false)  )}

Было очень приятно осознать, что авторы библиотеки позаботились и о простоте тестирования.

В заключение


Если вы уже сталкивались с конечными автоматами и не понимали, зачем их использовать, то надеюсь, что мой рассказ помог вам разобраться в этом. Иногда они действительно нужны, и с ними очень приятно работать.

Да, конечные автоматы не всегда оправданы. Поэтому к их использованию надо подходить, взвесив все за и против.
Подробнее..

UI элементы и жесты в мобильных приложениях

05.02.2021 18:14:24 | Автор: admin


Хабр, привет! Вы часто задумывались, обнаружив баг в мобильном приложении и заводя его в баг-трекер, как правильно назвать ту или иную часть интерфейса или действие, которые привели к ошибке? Или читаешь описание задачи и задумываешься, как должен выглядеть какой-то экран и что должно появиться при тапе на кнопку. А может, вы описываете продуктовые задачи и не всегда чувствуете себя на одной волне с дизайнерами и разработчиками, которые иногда начинают говорить на эльфийском? Чтобы исключить недопонимание, неясности и вопросы, мы решили создать перечень наиболее распространенных элементов и жестов и показать их на примере Юлы.

А вы знали, как называется та самая выезжающая снизу экрана шторка или несколько (три и более) тапов подряд? Ответы на эти вопросы и названия многих других элементов читайте в нашей статье.

Splashscreen изображение, заставка, которую пользователь видит во время загрузки приложения.



Заглушка название говорит само за себя: это элемент, сигнализирующий о какой-то проблеме(отсутствует интернет-соединение, сервер временно недоступен, ведутся технические работы, по вашему запросу ничего не найдено и т.п.). Обычно заглушка отображается там, где должен быть контент, но по каким-то причинам он не был получен.



Webview компонент, который позволяет отобразить страницы веб-сайта в приложении. Например, webview Как получить бонусы:



Popup всплывающее окно, которое появляется внезапно, без запроса пользователя, и отображается поверх экрана, на котором находился пользователь. Не стоит путать с диалоговым окном, которое появляется при совершении пользователем какого-либо действия.



Action menu кнопка, которая представляет собой три точки, и при нажатии (тапе) на которую открывается меню с несколькими actionами.



Tab вкладка; обычно переключение между табами осуществляется нажатием (тапом) на нужный таб или смахивание (свайпом) вправо/влево.



Toast всплывающее уведомление, не блокирующее работоспособность приложения и плавно исчезающее спустя несколько секунд. Может сообщать о какой-то ошибке, о совершении какого-то действия (например, публикация каких-то изменений). Обычно тоаст содержит текстовую информацию, но может содержать и картинку.



Progress Bar индикатор степени выполнения какого-либо действия (например, показывает оставшееся время работы активности продвижение товара).



TabBar панель вкладок в нижней части экрана, позволяющая быстро переключаться между разделами приложения.



AppBar (Android) / NavBar (iOS) панель инструментов в верхней части экрана, содержащая кнопки управления текущим экраном.



Alert оповещение, которое передает важную информацию, связанную с состоянием приложения или устройства, и часто запрашивает обратную связь. Алерт состоит из заголовка, необязательного сообщения, одной или нескольких кнопок.



Toggle switches/Тумблер переключатель между двумя состояниями вкл/выкл.



Bottomsheet информационная панель, появляющаяся снизу экрана поверх текущего состояния при совершении какого-нибудь действия. Может содержать информацию, а также какие-либо действия.



Bubble овальный элемент выбора какого-либо параметра, чаще всего используется в фильтрах.



Строка поиска поле ввода для поискового запроса.

Placeholder текстовая заглушка в поле ввода, подсказывающая, что можно туда ввести (на скринах текст Поиск объявлений).



Page Controls элемент управления, который отображает текущее положение экрана в плоском списке страниц (на скринах точки над кнопкой, отображающие текущее положение через изменение цвета).



Counter точка или число, обозначающее количество непросмотренных уведомлений (например, количество непрочитанных сообщений).



Overlay перекрывающий слой, который позволяет затемнить или осветлить элемент, на который он был наложен.



Tooltip всплывающее сообщение, которое завязано на элемент и обучает использованию той или иной части приложения.



Onboarding обучающая функциональность в приложении, появляющаяся при первом запуске для ознакомления пользователя с продуктом.



Suggest List выпадающий список, состоящий из подсказок; появляется при вводе букв, слов или символов в поле ввода. Или список ранее совершенных поисковых запросов. Отдельный пункт из этого списка Suggest.



Checkbox элемент интерфейса, позволяющий выбрать любое количество опций (ни одной, одну или несколько).



Status Bar строка состояния, содержащая общую информацию об устройстве: время, дату, сеть, уровень заряда и т.п.



Slider горизонтальная шкала с элементом управления, по которой скольжением пальца можно управлять состоянием или значением характеристики (в нашем случае расстоянием от указанного адреса):



Жесты


Тап касание, нажатие на сенсорный экран. Чтобы открыть любое приложение на смартфоне мы тапаем на его иконку.

Double tap два коротких касания, двойной тап.

Мультитап три и более тапов подряд по одному элементу.

Лонгтап нажатие с удержанием на несколько секунд. Позволяет открыть дополнительные опции там, где они есть.

Скролл вертикальное пролистывание содержимого скольжением пальца по экрану сверху вниз или снизу вверх.

Свайп смахивание вниз, вверх, вправо или влево. Похоже на скролл, только с легким, коротким касанием.

Pull to refresh (p2r) дословный перевод: потяни для обновления.

Drag&Drop изменение положения элементов интерфейса с помощью перетягивания: как говорит нам название тащи и бросай!

Pinch жест, используемый для изменения масштаба картинки (увеличения или уменьшения): для уменьшения два пальца касаются экрана и сводятся вместе, для увеличения разводятся в стороны.

Вот и весь наш список терминов, описывающих элементы интерфейса и жесты. А чем его дополнили бы вы?
Подробнее..

Как приручить Charles Proxy?

12.11.2020 14:14:33 | Автор: admin
Привет! Многие из тех, кто приходит к нам на собеседование на должность тестировщика, с гордостью заверяют, что они могут пользоваться Charles Proxy. Но когда погружаешься в техническую часть, то становится очевидно, что кандидат только слышал об этом инструменте. Давайте уже наконец скорее приручим эту вазу!



Википедия нам сообщает, что:

Charles представляет собой кроссплатформенное приложение прокси-сервера для отладки HTTP, написанное на Java. Он позволяет пользователю просматривать HTTP, HTTPS и активированный трафик TCP-порта, доступ к которому осуществляется с локального компьютера, на него или через него. Сюда входят запросы и ответы, включая HTTP-заголовки и метаданные (например, файлы cookie, кэширование и кодирование информации), с функциями, предназначенными для помощи разработчикам и тестировщикам в анализе соединений и обмене сообщениями.

Небольшое пояснение

Сниффинг процесс мониторинга и перехвата всех пакетов, проходящих через сеть, с помощью инструментов сниффинга (Charles Proxy).

Первые шаги


1. Установка и запуск

Для начала необходимо загрузить и установить приложение.

Если у вас не приобретена лицензия, то будет доступна 30-ти дневная пробная версия с ограничениями (функциональность не блокируется, но будут появляться окна с таймаутом 5-10 секунд до возобновления использования, а также через 30 минут будет завершаться работа приложения).

2. Начинаем сниффить трафик

Запустите Charles Proxy, зайдите в меню Help SSL Proxying Install Charles Root Certificate (см.1) Установить сертификат Импортируем сертификат.



Теперь у вас отображаются запросы, однако они зашифрованы, и кроме иероглифов ничего не видно. Чтобы видеть Request/Response в нормальном виде, нужно включить SSL Proxying и настроить домены, пакеты которых мы хотим перехватывать. А хотим мы получать запросы со всех сайтов. Для этого перейдите в раздел Proxy SSL Proxying Settings.



В открывшемся диалоговом окне поставьте галочку Enable SSL Proxying, выберите раздел Enclude и нажмите Add.



Далее заполните поле Host значением * (как показано на скриншоте) и нажмите ОК.



В диалоговом окне SSL Proxying Settings нажмите ОК.



Теперь можно смотреть запросы, отправляемые на сервер, и ответы сервера.

3. Проксирование трафика веб-браузера

При перезапуске Charles достаточно активировать Windows Proxy (если у вас ОС Windows) или Mac Proxy.



4. Настройка прокси на Android

Чтобы отображались запросы приложения Android, у вас должна стоять соответствующая сборка Android-приложения, c установленным в манифесте разрешением. Давайте представим, что такое приложение имеется, и мы хотим начать получать его трафик.

Для этого узнаем IP-адрес ПК: в Charles Proxy перейдем в Help Local IP Address. Видим, что ваш IP: 192.168.1.50.



Далее возьмите в руки телефон, откройте Свойства сети Название сети WiFi Прокси-сервер Вручную Имя хоста: *ваш IP* / Порт: *8888* Сохраните измененные свойства сети.

Теперь необходимо перейти по ссылке chls.pro/ssl или charlesproxy.com/getssl, а далее начнется автоматическая загрузка сертификата. Откройте его, задайте имя сертификата, и теперь у вас есть доступ к трафику Android-приложения.

5. Настройка прокси на iOS

Возьмите в руки iPhone, откройте Свойства сети Название сети WiFi Прокси-сервер Вручную Имя хоста: *Наш IP* / Порт: *8888* Сохраните измененные свойства сети.

Теперь необходимо перейти по ссылке chls.pro/ssl или charlesproxy.com/getssl, Разрешить загрузку профиля конфигурации. Далее перейдите в Настройки Профиль загружен Установить. Затем перейдите в Настройки Основные Об этом устройстве Доверие сертификатам найдите установленный сертификат и сделайте его Доверенным.

Функциональность Charles Proxy


  1. Подмена данных:
  2. Proxy:
  3. Tools:
  4. Recording Settings
  5. Focus
  6. Repeat
  7. Repeat Advanced

1. Подмена данных


Представим, что нам надо протестировать на клиенте верстку. Нужно проверить, как будет отображаться большое количество бонусов у пользователя. Один из вариантов, который многие предложат: изменить в БД количество бонусов и проверить на клиенте. Да, вы будете правы! Однако на сервере может быть кэш, и необходимо подождать какое-то время, пока количество бонусов не обновится, либо просто подключиться к самой базе и выполнить запрос это занимает определенное время. Есть вариант проще: изменить ответ от сервера! В Charles Proxy есть три способа подмены данных:

1.1 Breakpoint


Breakpoint это некая точка остановки запроса. Когда обнаруживается запрос из заданного списка, для дальнейшего ручного взаимодействия с параметрами запроса открывается отдельное окно. В нём перейдите к ручному изменению запросов и ответов. Удобно использовать эту функцию, когда тестируете API или разные ответы сервера.

У нас имеется приложение и профиль пользователя, у которого сейчас 0 бонусов на счету:


Запрос, в котором приходит это количество бонусов: https://api.youla.io/api/v1/user/5e6222bbbedcc5975d2375f8



Чтобы повесить Breakpoint на запрос, перейдите в раздел Proxy Breakpoint Settings. Далее поставьте галочку Enable Breakpoints Add, и в открывшемся диалогом окне Edit Breakpoint вставьте URL запроса, как показано на скриншоте:



Для примера поставьте две галочки Request и Response. Далее нажмите OK, и ещё раз OK в окне Breakpoint Settings. Теперь выполните запрос еще раз, то есть на клиенте заново откроется экран с профилем пользователя.

В Charles Proxy мы видим, что выполнение запроса ставится на паузу:



Здесь можно изменить параметры запроса. Но сейчас это делать не нужно, нажмите Execute. Следом у нас ставится на паузу уже пришедший ответ от сервера. И тут как раз мы должны отредактировать Response. Найдите нужный параметр bonus_cnt: 45.



Далее измените значение параметра bonus_cnt, например, на 1 000 000 бонусов, и нажмите Execute.



На клиенте отобразится новое количество бонусов. Мы богаты!


1.2 Rewrite


Rewrite это инструмент, позволяющий создавать правила, которые изменяют запросы и ответы, когда те проходят через Charles Proxy. Например, можно добавлять и изменять заголовок, искать и заменять текст в теле ответа или запроса, и т.д.

Попробуем с помощью Rewrite изменить количество бонусов нашего пользователя. Для этого откройте Tools Rewrite галочка Enable Rewrite Add. В поле Name можно ввести любое название подмены, например, Change bonus, либо оставить по умолчанию Untitled Set.



Следующим шагом необходимо добавить в Location путь запроса. Для этого, в разделе Location Add заполните следующие поля и сохраните:

Host: https://api.youla.io

Path: /api/v1/user/5e6222bbbedcc5975d2375f8



После того, как вы добавили путь запроса, необходимо изменить сам параметр и его значение. Для этого нужно создать Rewrite Rule:

Type: Body (потому что параметр находится в теле);

Where: Response (потому что параметр находится в ответе от сервера);

Раздел Match: в Value укажите значение и параметр, который возвращает сервер;

Раздел Replace: в Value укажите значение и параметр, который вы хотите увидеть на клиенте.



Далее сохраните Rewrite Rule и нажмите ОК на вкладке Rewrite Settings. На клиенте перезапросите еще раз профиль пользователя. У вас автоматически подменилось количество бонусов пользователя. Мы снова богаты!


1.3 Map Local


Map Local инструмент, который позволяет использовать локальные файлы, словно они являются частью сервера.

Перейдите в Tools Map Local.



Далее в окошке Map Local Settings нажмите Add Хост: https://api.youla.io/api/v1/user/5e6222bbbedcc5975d2375f8 Local path: путь на компьютере до файла. Можете использовать готовые медиа-файлы, HTML, CSS, JSON, XML. Больше подходит, конечно, разработчикам, чтобы не загружать данные на сервер для его последующего тестирования, но и тестировщик может найти грамотное применение. Мы заранее подготовили ответ, который нам будет нужен, и сохранили в файл change_bonus.json:



Сохраните введенные значения на вкладке Edit Mapping и на вкладке Map Local Settings.



На клиенте перезапросите еще раз профиль пользователя. У вас автоматически подменилось количество бонусов пользователя. Мы снова богаты!


Давайте рассмотрим другие возможности инструмента Charles Proxy. И начнем с самого начала, с вкладки Proxy.

2.1 Throttle Settings


Throttle Settings функция, позволяющая задавать разные параметры скорости соединения с выбранным доменом.

Функция для тех, кто любит тестировать в лифте, в метро, в подземном переходе. Перейдем в Proxy Throttle Settings галочка Enable Throttling. Если не разбираетесь во всех перечисленных пунктах, то можете использовать Throttle preset и там выбрать подходящую для теста скорость, а система автоматически заполнит остальные поля.



Если выбрать Only for selected hosts, то можно задать определенный хост, к которому будут применяться ваши настройки. Здесь можно использовать готовые пресеты с настройками для различных типов (4G, 3G и т. д.). А также можно задать различные параметры, коротко перечислю некоторые из них:

Bandwidth максимальный объем данных, который может быть передан с течением времени.

Utilisation доля общей пропускной способности, которая может быть предоставлена пользователю в любой момент времени.

Latency задержка в миллисекундах по запросу firts между клиентом и удаленным сервером.

MTU максимальное передающее устройство для текущего пресета.

Reliability мера вероятности, что соединение не удастся. Используется для имитации ненадежных сетевых условий.

Stability мера вероятности, что соединение будет нестабильным и, следовательно, снизится качество. Полезно для моделирования сетей, в которых периодических падает качество связи, например, мобильных.

2.2 Reverse Proxies


Reverse proxy обратный прокси-сервер. Обычно используется для того, чтобы принимать запросы из Интернета и перенаправлять их на один из веб-серверов.



2.3 Port Forwarding


Port Forwarding проброс портов, который иногда называют перенаправлением портов, или туннелированием процесс пересылки трафика, адресованного конкретному сетевому порту, с одного сетевого узла на другой. Этот метод позволяет внешнему пользователю достичь порта внутри локальной сети.



2.4 MacOS Proxy/Windows Proxy


MacOS Proxy или Windows Proxy (в зависимости от вашей ОС) проксирование трафика с вашего веб-браузера.



Разобравшись с разделом Proxy, перейдем к разделу Tools.

3.1 No Caching


Инструмент No Caching предотвращает кэширование, манипулируя заголовками HTTP, которые управляют кэшированием ответов. Заголовки If-Modified-Since и If-None-Match удаляются из запросов, добавляются Pragma: no-cache и Cache-control: no-cache. Заголовки Expires, Last-Modified и ETag удаляются из ответов и добавляются Expires: 0 и Cache-Control: no-cache.



3.2 Block Cookies


Block Cookies заголовок файла Cookie удаляется из запросов, предотвращая отправку значений файла из клиентского приложения (например веб-браузер) на удаленный сервер. А также из ответов удаляется заголовок Set-Cookie, предотвращая получение клиентским приложением запросов на установку файлов cookie с удаленного сервера. В настройках можно включить удаление Cookie как для всех хостов, так и для выбранных. В примере ниже включено удаление Cookie для всех запросов.



3.3 Map Remote


Map Remote позволяет переадресовать запросы с одного URL Map From на другой Map To. Подменяет хост, путь целиком или только параметры в зависимости от вашей задачи. В примере ниже подменён запрос с prod-сервера на dev-сервер.



3.4 Block List


Block List позволяет блокировать определённые доменные имена. Когда веб-браузер попытается запросить любую страницу из заблокированного доменного имени, она заблокируется. Можно выбрать либо Drop connection, либо возврат 403 ошибки.



3.5 DNS Spoofing


Виртуальный хостинг это когда у вас есть несколько сайтов на одном IP-адресе, и веб-сервер определяет, какой сайт вы запрашиваете, основываясь на имени, введённом в браузере. Точнее, сервер смотрит на заголовок хоста, отправленный в запросе. Например, когда нужно подменить хосты, чтобы при вводе какого-либо адреса в браузере (скажем, api.youla.ru) запросы уходили по другому адресу (допустим, на тестовую площадку).

DNS Spoofing перенаправляет доменное имя на определенный IP-адрес.



3.6 Mirror


Mirror эта функция позволяет автоматически сохранять все ответы, возвращаемые в Charles Proxy. Они раскладываются локально в такой же иерархии, как на сервере. Если внезапно случился даунтайм на бэкенде, отвалилась тестовая среда и т. д., у вас уже есть готовые моки для Map Local. Активировать функцию можно так: Tools Mirror или Tools Auto Save.



3.7 Compose


Compose функция редактирования запросов, которые вы поймали.

Например вы добавляете в избранное какой-то товар, но почему-то он не добавляется. Вы можете отредактировать уже отправленный запрос и отправить его еще раз. Для этого необходимо выбрать нужный запрос из списка, нажать на нём правой кнопкой и выбрать Compose. Иконка у запроса поменяется, и теперь можно смело его редактировать.



После того, как вы изменили нужные значения в запросе, нажмите внизу Execute, чтобы отправить запрос на сервер.



4. Recording Settings


Recording Settings настройки отображения списков разрешенных и запрещенных доменов.

Во вкладке Options можно настроить лимит, то есть количество запросов, которое Charles Proxy может записать.



Во вкладке Include можно выбрать конкретный домен для отображения пакетов.



Во вкладке Exclude можем выбрать те домены, которые необходимо спрятать при сниффинге.



5. Focus


Focus эта функция перемещает домен на первые позиции в списке.



6. Repeat


Repeat отправляет на сервер запрос, идентичный выбранному.



7. Repeat Advanced


Repeat Advanced идентично Repeat, только можно выбрать количество отправляемых запросов и задержку между ними. Эта функция пригодится при проверке реакции сервера на флуд.

Здесь Concurrency количество пользователей, а Iterations количество повторений каждого запроса. Также можно поставить галочку Show results in new Session, в таком случае откроется новое окно, где будут выполняться запросы.



Резюме


В этой статье мы постарались описать те функции Charles Proxy, которыми пользуются тестировщики мобильных приложений. На этом всё, и не забывайте прикреплять к баг-репорту сессию из сниффера.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru