Перейти к содержимому

Аналитика тестов Bazel

Требования

tuist bazel setup настраивает отчётность по отдельным тест-кейсам в .bazelrc.tuist, поэтому обычный bazel test отправляет данные об отдельных тест-кейсах на те же дашборды, что и другие системы сборки:

bash
bazel test //app:tests

Чтобы также применить карантин, запускайте тесты через обёртку Tuist. Аргументы после -- передаются в bazel test:

bash
tuist bazel test -- //app:tests

Что отслеживается#

Tuist разбирает отчёты test.xml и захватывает вывод test.log, который Bazel генерирует для каждой цели тестирования, а затем агрегирует их в общую модель запусков тестов. Каждый запуск фиксирует:

  • Статус прохождения, сбоя и пропуска каждого тест-кейса вместе с длительностью.
  • Цель тестирования, класс и структуру набора тестов.
  • Попытки повторного запуска, если Bazel настроен на повтор нестабильных тестов.
  • Вывод ошибок, захваченный из test.log цели.

Страницы Запуски тестов, Тест-кейсы и отдельных тестов работают для Bazel так же, как и для других систем сборки.

Генерация JUnit-отчётов по каждому тест-кейсу#

Строки по отдельным тест-кейсам зависят от того, записывает ли цель тестирования JUnit-файл test.xml по пути $XML_OUTPUT_FILE, который предоставляет Bazel. Если раннер не создаёт такой файл, Bazel использует сгенерированный отчёт с одним тест-кейсом, названный по имени цели, и Tuist показывает одну строку на цель (помеченную как Цель Bazel в списке тест-кейсов), при этом исходный test.log остаётся доступен на странице запуска.

Большинство правил тестирования Bazel уже создают полноценный test.xml:

  • java_test и kt_jvm_test: JUnit встроен.
  • cc_test с GoogleTest: раннер записывает JUnit при компиляции с недавней версией gtest; в старых конфигурациях требуется --gtest_output=xml:$XML_OUTPUT_FILE.
  • py_test: используйте pytest с --junitxml=$XML_OUTPUT_FILE или раннер pytest из rules_python.
  • go_test: передайте вывод go test -json через gotestsum --junitfile=$XML_OUTPUT_FILE или оберните вспомогательным скриптом, генерирующим JUnit.

rust_test из rules_rust и rules_rs использует стандартный механизм libtest, который не создаёт JUnit-отчёты в стабильной версии Rust. Оберните цель тестирования скриптом, который разбирает вывод libtest и записывает JUnit в $XML_OUTPUT_FILE; так вы сохраните строки по отдельным тест-кейсам в Tuist, а запуск останется одной целью тестирования Bazel.

Идентификация тестов#

Тест-кейсы идентифицируются по метке цели, имени класса (с откатом к имени набора тестов) и имени теста. Это позволяет разделять методы с одинаковыми именами в разных классах. Старые отчёты, использовавшие другое имя охватывающего набора тестов, сохраняют историю под старой идентификацией; изменения состояния, применённые к старой идентификации, нужно повторно применить к новой, а команда предупреждает, когда сбой соответствует старой идентификации, чтобы вы знали, какую политику перенести.

Передача контекста CI#

Tuist считывает информацию о коммите и ветке Git из метаданных сборки Bazel, чтобы запуски на одном и том же коммите можно было сравнивать между окружениями. Большинство систем непрерывной интеграции уже устанавливают эти значения; если ваша система этого не делает, передайте их явно:

bash
tuist bazel test -- \
--build_metadata=CI=true \
--build_metadata=GIT_COMMIT="$GIT_COMMIT" \
--build_metadata=GIT_BRANCH="$GIT_BRANCH" //app:tests

Тот же флаг --build_metadata описан на странице Аналитика сборок Bazel для маркировки вызовов, поэтому один набор флагов покрывает обе области.

Нестабильные тесты и карантин#

Повторные запуски, обнаружение нестабильности между запусками и карантин по отдельным тест-кейсам (Игнорировать и Пропустить) работают через tuist bazel test. Полный рабочий процесс описан в разделе Нестабильные тесты в Bazel.

Хранение данных#

Tuist хранит вызов Bazel, породивший запуск теста, его логи и ожидающие обработки записи о приёме тестов в течение 90 дней. Тест-кейсы и история их запусков используют ту же модель, что и в других системах сборки, и не подпадают под этот срок. Полная политика описана в разделе хранение данных.