Базель и py_test в песочнице - какой-либо способ определить выходы?

Я бегу несколько py_test() конфигурации по количеству проектов. Поскольку их много, стандартный механизм песочницы кажется удобным: тесты не мешают друг другу и работают параллельно бесплатно.

Это, однако, обходится дорого, поскольку, как я понимаю, песочница заставит bazel запускать тесты во временных каталогах. В сочетании с py_test правило, не определяющее какой-либо параметр outs ( https://docs.bazel.build/versions/master/be/python.html), это, вероятно, означает, что после теста не будет сгенерировано ни одного сгенерированного файла.

Чего я хочу добиться, это две вещи:

  1. Сохранение результатов теста, разбитых по тестам (думаю, я смогу заставить его работать, используя capsys и явная запись в файл с именем, аналогичным имени теста). Проблема здесь в том, что файл окажется в изолированном каталоге, то есть: /home/user/.cache/bazel/_bazel_user/12342134213421342134/sandbox/linux-sandbox/1/execroot/project_name/bazel-out/k8-fastbuild/bin/test_suite.runfiles/ и будет удален позже.
  2. Я хотел бы получить сводную информацию о тестах в формате 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, она всегда сводит меня с ума.

Другие вопросы по тегам