Базель и py_test в песочнице - какой-либо способ определить выходы?
Я бегу несколько py_test()
конфигурации по количеству проектов. Поскольку их много, стандартный механизм песочницы кажется удобным: тесты не мешают друг другу и работают параллельно бесплатно.
Это, однако, обходится дорого, поскольку, как я понимаю, песочница заставит bazel запускать тесты во временных каталогах. В сочетании с py_test
правило, не определяющее какой-либо параметр outs ( https://docs.bazel.build/versions/master/be/python.html), это, вероятно, означает, что после теста не будет сгенерировано ни одного сгенерированного файла.
Чего я хочу добиться, это две вещи:
- Сохранение результатов теста, разбитых по тестам (думаю, я смогу заставить его работать, используя
capsys
и явная запись в файл с именем, аналогичным имени теста). Проблема здесь в том, что файл окажется в изолированном каталоге, то есть:/home/user/.cache/bazel/_bazel_user/12342134213421342134/sandbox/linux-sandbox/1/execroot/project_name/bazel-out/k8-fastbuild/bin/test_suite.runfiles/
и будет удален позже. - Я хотел бы получить сводную информацию о тестах в формате XML. Bazel сам генерирует XML-файл в формате JUnit, что было бы хорошо, но, к сожалению, он не работает должным образом ( https://github.com/bazelbuild/bazel/issues/3413). Самым простым решением было бы предоставить параметр
--junitxml=path
( https://docs.pytest.org/en/latest/usage.html), который работает, но опять же - создает файл во временном изолированном каталоге.
Другие правила в bazel определяют ауты как файлы, которые они будут генерировать, т.е. https://docs.bazel.build/versions/master/be/make-variables.html: genrule
содержит параметр аутов.
Таким образом, вопрос сводится к следующему: есть ли способ в Bazel повторно использовать (или обернуть) py_test
Править и определить некоторые выходные файлы, которые он будет генерировать?
2 ответа
Немного поэкспериментировав с Базелем, я пришел к выводу, что нет простого способа расширить py_test
добавить выводы к нему. Также было бы довольно сложно создать собственное правило с нуля.
Однако оказывается, что все тесты в Bazel определяют некоторые переменные среды, которые можно использовать. На самом деле, был задан еще один похожий вопрос, который решил проблему, используя их: bazel - записываемый архивируемый путь для выполнения теста.
В моих тестах я запускаю pytest из Python, поэтому программно можно расширить аргументы запуска:
def _get_log_file_args():
# Prepare the path to the log file, based on environmental
# variables defined by Bazel.
#
# As per docs, tests should not rely on these variables
# defined, so the framework will omit logging to file
# if necessary variables are undefined.
# See: https://docs.bazel.build/versions/master/test-encyclopedia.html#initial-conditions
LOG_DIR_ENV_VARIABLE = "TEST_UNDECLARED_OUTPUTS_DIR"
log_dir = os.environ.get(LOG_DIR_ENV_VARIABLE)
if log_dir:
file_log_path = os.path.join(log_dir, "test_output.log")
return [f"--log-file={file_log_path}"]
logger.warning(f"Environment variable '{LOG_DIR_ENV_VARIABLE}' used as the logging directory is not set. "
"Logging to file will be disabled.")
return [] # no file logging
Тогда это вопрос обработки окончательного архива.zip по адресу ./bazel-out/darwin-fastbuild/testlogs/<package-name>/<target-name>/test.outputs/outputs.zip
(согласно связанному вопросу).
Просто напишите вывод xml в место, указанное в
XML_OUTPUT_FILE
переменная окружения. В этом случае файл не будет заархивирован.
Из исходного кода здесь:
https://github.com/bazelbuild/bazel/blob/master/tools/test/test-setup.sh#L188
if [ -n "${XML_OUTPUT_FILE-}" -a ! -f "${XML_OUTPUT_FILE-}" ]; then
# Create a default XML output file if the test runner hasn't generated
Я не могу достаточно ненавидеть документацию Bazel, она всегда сводит меня с ума.