Тонкая настройка параллелизма в тестах 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 смогут вызывать друг друга.

Neva
Neva

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

Комментарии (0)