Тонкая настройка параллелизма в тестах Go
В Go есть три способа управления параллельностью тестов:
Флаг
-p
Флаг
-parallel
Вызов функции
t.Parallel()
Но многие ли понимают, как они работают? И зачем нам все три?
Оказывается:
-p
управляет числом тестовых пакетов, выполняемых параллельно.-parallel
определяет количество тестовых функций внутри одного пакета, выполняемых параллельно.t.Parallel()
помечает тестовую функцию, разрешая Go выполнять её параллельно с другими тестами в том же пакете.
Пример 1
Допустим, у нас есть 999 пакетов, в каждом из которых 999 тестовых функций, но ни одна из них не использует t.Parallel()
. Что произойдет?
Ответ: N тестовых пакетов будет выполняться параллельно (N равно количеству ядер CPU), но внутри каждого пакета тесты будут запускаться последовательно. В итоге одновременно выполняются N тестов.
Пример 2
Теперь тот же сценарий, но добавим -p 1
. Что изменится?
Ответ: полностью последовательное выполнение тестов.
Пример 3
А теперь добавим t.Parallel()
, оставив -p 1
. Что будет?
Ответ: t.Parallel()
в сочетании с -p 1
означает "в каждый момент времени выполняется только один пакет, но внутри него N тестов могут выполняться параллельно", где N — количество ядер CPU.
Вывод
Максимальный контроль достигается комбинацией всех трёх параметров: -p X -parallel Y + t.Parallel()
.
Но будьте осторожны с состоянием в тестах (как всегда, state — корень всех проблем, но без него не обойтись).
Язык программирования Neva
Разрабатываете на Go? Обратите внимание на Nevalang — экспериментальный язык программирования, построенный на основе Go, который решает некоторые его проблемы: гонки данных, nil pointer dereference и многое другое. В 2025 году он получит визуальный редактор, Rust-подобные enum'ы и многое другое. В перспективе Neva и Go смогут вызывать друг друга.

Заинтересовало? Поставьте ⭐ и присоединяйтесь к нашему сообществу. Нам нужны разработчики (не только gophers!) для тестирования и улучшения языка. Давайте вместе менять программирование! Go — классный, но можно сделать лучше: