Почему Jest --runInBand ускоряет тесты?

Я прочитал, что флаг --runInBand ускоряет продолжительность теста Jest на 50% на серверах CI. Я не могу найти объяснение в Интернете о том, что делает этот флаг, за исключением того, что он позволяет запускать тесты в одном и том же потоке и последовательно.

Почему запуск теста в одном потоке и последовательное ускорение? Интуитивно, не следует ли это замедлять работу?

Ответ 1

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

... использование --runInBand помогает в среде с ограниченными ресурсами.

а также

... --runInBand наши тесты с> 1,5 часов (на самом деле я не знаю, как долго, потому что Дженкинс пробыл в 1,5 часа) примерно до 4 минут. (Примечание: у нас очень плохие ресурсы для нашего сервера сборки)

Как мы видим, эти пользователи улучшили свои характеристики на своих машинах, хотя у них были ограниченные ресурсы. Если мы прочитаем, что делает флаг --runInBand из документов, он говорит:

Псевдоним: -i. Запускайте все тесты последовательно в текущем процессе, а не создавайте рабочий пул дочерних процессов, которые запускают тесты. Это может быть полезно для отладки.

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

Тем не менее, я считаю, что это так, только если машина, которую вы используете, также имеет ограниченные ресурсы. Если вы использовали более "мощную" машину (то есть: несколько ядер, достойную RAM, SSD и т.д.), Используя несколько потоков, вероятно, будет лучше, чем запуск одного.

Ответ 2

Когда вы запускаете тесты в многопоточности, просто создайте кеш для каждого потока. При запуске с --runInBand jest используйте одну кэш-память для всех тестов.

Я обнаружил, что после --runInBand 20 идентичных файлов тестов, сначала с ключом --runInBand, первый тест занимает 25 секунд, а следующие идентичные тесты занимают 2-3 секунды каждый.

Когда я запускаю тесты без --runInBand, каждый идентичный тестовый файл выполняется за 25 секунд.