Заметки Full-Stack QA

Проверяем работу приложений при плохом соединении

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

На помощь к нам придет утилита Clumsy, доступная под Windows, которая может имитировать сетевые соединения плохого качества
https://github.com/jagt/clumsy/releases

Loopback packets: пакеты отправляются с локального хоста на локальный хост. Как праавило, это трафик 127.0.0.1
Inbound packets: входящие пакеты на ваш компьютер
Outbound packets: исходящие пакеты с вашего компьютера
Filtering: позволяет прописать фильтр вручную или выбрать предустановленный для Вашего теста из пресетов. Например, вы можете выбрать IP, протокол или другие критерии.

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

Lag создает задержку в сети. Время указывается в миллисекундах.
Drop отбрасывает пакеты с указанной верноятностью.
Throttle блокирует трафик на определённое время и далее посылает его обратно.
Duplicate посылает повторно копии пакетов вслед за оригиналами с заданной вероятностю.
Out of order меняет порядок пакетов.
Tamper рандомно искажает содержимое пакетов.

Форматируем вывод json в консоли

Часто бывает так, что нужно дернуть API запрос, а сервер вернет json данные в одну строчку, например

curl https://github.com/manifest.json

Проверять такой ответ глазами — удовольствие еще то.
Конечно можно кинуть эти данные в online `beautify` сервис, а можно использовать `python` модуль и перенаправить вывод в него

curl https://github.com/manifest.json | python -m json.tool

Генерируем тестовое видео с заданными параметрами

В ffmpeg есть возможность генерировать тестовое видео с заданными параметрами, используя источник `testsrc`. В результате будет сгенерировано тестовое видео — цветовой шаблон, движущийся градиент прокрутки и сменяющаяся отметка времени.

ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=60 -vcodec h264 -pix_fmt yuv420p -bf 0 -g 30 testsrc.ts

В данном примере будет сгенерирован файл `testsrc.ts`, длительностью 10 секунд с разрешением 1920x1080 px, 60 кадров в секунду (fps)

`-vcodec h264` — задаем h264 кодек
`-bf 0` — в итоговом видео не будет `B` фреймов
`-g 30` — номер опорного `I` фрейма (GOP size), т. е. два `I` фрейма в секунду

RTSP сервер на скорую руку

Буквально в пару действий можно начать транлировать свой видеофайл по `rtsp`

Качаем с гита утилиту под свою ось
https://github.com/aler9/rtsp-simple-server/releases

При необходимости настраиваем в `.yml` файле и запускаем. По дефолту, она открывает несколько портов на «нулях», сейчас нас только интересует 8554

2022/02/22 21:49:51 INF rtsp-simple-server v0.17.17
2022/02/22 21:49:51 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2022/02/22 21:49:51 INF [RTMP] listener opened on :1935
2022/02/22 21:49:51 INF [HLS] listener opened on :8888

Далее, например, через `ffmpeg` отдаем ей видеоданные из файле и адрес, по которому будет доступен стрим

ffmpeg -re -stream_loop -1 -i output.mkv -c copy -f rtsp rtsp://localhost:8554/stream

Открываем линку в плеере

vlc rtsp://localhost:8554/stream

Если нужно сгенерировать «разные» потоки, можно добавить случайные параметры к адресу

rtsp://localhost:8554/stream?channel=01
rtsp://localhost:8554/stream?channel=02
rtsp://localhost:8554/stream?channel=03

Как быстро передать файлы по сети?

Часто бывает ситуация, когла нужно передать файлы по сети, например логи или креш-дампы.

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

python -m http.server

После выполнения этой команды, `python` открывает на «нулях» порт 8000. При обращении по адресу `http://ip:8000` будет отображен листинг дирректории, где запускалась команда

Далее, необходимые файлы скачиваем себе на компьютер для анализа, например, используя curl или wget

wget http://10.0.3.254:8000/http_log.log
curl http://10.0.3.254:8000/http_log.log --output http_log.log

Если же вам нужно открыть определенный порт* на конкретном сетевом интерфейсе используйте следующую команду

python -m http.server 8080 --bind 127.0.0.1

*) для открытия порта меньше 1024, необходимы права Администратора/root