Имитация плохой сети в CI
Окно необязательно. Тот же исполняемый файл работает как инструмент командной строки, сам завершается через заданное время и сообщает о случившемся так, чтобы пайплайн мог это прочитать.
Как выглядит шаг
Портите сеть на время теста, а затем дайте ей остановиться самой. Нет шага очистки, о котором можно забыть:
BeanNetworkTester.exe --loss 10 --latency 200 --target myapp.exe --duration 60
В задаче GitHub Actions на собственном (self-hosted) раннере Windows:
- name: Test the app on a poor connection
shell: pwsh
run: |
Start-Process -FilePath BeanNetworkTester.exe `
-ArgumentList '--loss 10 --latency 200 --target myapp.exe --duration 90'
npm test
Два замечания о раннере: для перехвата трафика нужны права администратора, а размещённый раннер их не даст, поэтому это место для собственной машины Windows.
У каждого завершения есть код
Ничто не заканчивается трассировкой стека. У каждого способа завершения запуска есть номер, поэтому пайплайн может отличить «ваше приложение упало» от «инструмент не смог запуститься»:
| Код | Значение |
|---|---|
| 0 | Завершено, как и было задано. |
| 1 | Что-то пошло не так во время работы. |
| 2 | Командная строка составлена неверно. |
| 3 | Недопустимая настройка или значение. |
| 4 | Файл сценария отклонён. |
| 5 | Не удалось прочитать или записать файл. |
| 6 | Проверка результата запуска не подтвердилась. |
| 7 | Нет прав администратора, поэтому драйвер не может загрузиться. |
| 130 | Прервано, обычно по Ctrl+C. |
| 143 | Завершено извне. |
Вывод, понятный машине
--format json пишет по одному объекту JSON в строке: выборки во время работы и сводку в конце, чтобы следующий шаг мог проверять утверждения о них:
BeanNetworkTester.exe --loss 5 --duration 30 --format json > run.ndjson
Строки журнала идут в стандартный поток ошибок, а данные в стандартный вывод, поэтому перенаправление данных никогда не смешивает их. --seed делает запуск повторяемым, а это именно то, что нужно нестабильному тесту, прежде чем кто-то сможет о нём спорить.
Пробный запуск, который ничего не трогает
Два параметра делают подключение безопасным ещё до того, как вы ему поверите: --dry-run сообщает, что сделали бы настройки, и завершается, а --simulate прогоняет весь движок на синтетическом трафике, не загружая драйвер и не трогая сеть. Оба полезны в сборке, которая не должна портить машину, на которой выполняется.