Базель и py_test в песочнице - какой-либо способ определить выходы? - PullRequest
0 голосов
/ 29 января 2019

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

Однако это обходится дорого, поскольку, как я понимаю, песочница вызоветБазель для запуска тестов во временных каталогах.В сочетании с правилом 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. Базель сам генерируетXML-файл в формате JUnit, что было бы хорошо, но, к сожалению, он не работает должным образом (https://github.com/bazelbuild/bazel/issues/3413). Самое простое решение - предоставить параметр --junitxml=path (https://docs.pytest.org/en/latest/usage.html#creating-junitxml-format-files), который работает, но снова -генерирует файл во временном изолированном каталоге.

Другие правила в bazel определяют outs как файлы, которые они будут генерировать, т.е. https://docs.bazel.build/versions/master/be/make-variables.html#predefined_genrule_variables: genrule содержит оуПараметр ts .

Таким образом, вопрос сводится к следующему: есть ли способ в bazel повторно использовать (или обернуть) правило py_test и определить некоторые выходные файлы, которые он будет генерировать?

1 Ответ

0 голосов
/ 31 января 2019

После нескольких экспериментов с Bazel я пришел к выводу, что нет простого способа расширить 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 (согласно связанному вопросу).

...