Вывод XML Bazel TestNG

У меня есть небольшой Java-проект: один пакет с зависимостями от Google Truth, Google Guava, аннотаций JSR305 и TestNG для модульных тестов. У меня возникли проблемы с запуском тестов с Bazel. Я могу создать правило java_test и запустить его с помощью bazel test, но XML-вывод Bazel дает мне один проход / сбой для всего набора тестов без информации об отдельных сбоях. XML от TestNG очищается вместе с песочницей.

Чтобы обойти это, я создал Genrule для TestNG XML, но в документации прямо сказано: «Не используйте Genrule для тестирования», поэтому мне интересно, есть ли лучший подход.

Мой файл BUILD выглядит так:

java_library(
    name='myproject',
    srcs=glob(['src/main/java/**/*.java']),
    deps=[
        '@com_google_code_findbugs_jsr305//jar',
        '@com_google_guava_guava//jar',
    ],
)

java_library(
    name='myproject-test-lib',
    srcs=glob(['src/test/java/**/*.java']),
    deps=[
        ':myproject',
        '@com_google_code_findbugs_jsr305//jar',
        '@com_google_guava_guava//jar',
        '@com_google_truth_truth//jar',
        '@org_testng_testng//jar',
    ],
)

java_test(
    name='myproject-test',
    size='small',
    runtime_deps=[
        ':myproject',
        ':myproject-test-lib',
        '@org_testng_testng//jar',
        '@com_beust_jcommander//jar',  # Used by TestNG CLI
        '@org_yaml_snakeyaml//jar',  # Used by TestNG to parse YAML
        '@junit_junit//jar',  # Dependency of Truth
    ],
    data=['testng.yaml'],
    use_testrunner=False,
    main_class='org.testng.TestNG',
    args=['testng.yaml'],
)

genrule(
    name='myproject-test-report',
    srcs=['testng.yaml'],
    tools=[
        ':myproject',
        ':myproject-test-lib',
        '@com_google_code_findbugs_jsr305//jar',
        '@com_google_guava_guava//jar',
        '@com_google_truth_truth//jar',
        '@org_testng_testng//jar',
        '@com_beust_jcommander//jar',  # Used by TestNG CLI
        '@org_yaml_snakeyaml//jar',  # Used by TestNG to parse YAML
        '@junit_junit//jar',  # Dependency of Truth
    ],
    outs=['testng_report'],
    cmd='$(JAVA) -cp $(location :myproject):$(location :myproject-test-lib):$(location @com_google_code_findbugs_jsr305//jar):$(location @com_google_guava_guava//jar):$(location @com_google_truth_truth//jar):$(location @org_testng_testng//jar):$(location @com_beust_jcommander//jar):$(location @org_yaml_snakeyaml//jar):$(location @junit_junit//jar) org.testng.TestNG -d $(OUTS) -usedefaultlisteners false testng.yaml'
)

... Я подозреваю, что есть способ лучше справиться с classpath. Мой файл WORKSPACE, для полноты:

workspace(name='com_example_myproject')

maven_jar(
    name='com_google_code_findbugs_jsr305',
    artifact='com.google.code.findbugs:jsr305:3.0.1',
    sha1='f7be08ec23c21485b9b5a1cf1654c2ec8c58168d',
)

maven_jar(
    name='com_google_guava_guava',
    artifact='com.google.guava:guava:21.0',
    sha1='3a3d111be1be1b745edfa7d91678a12d7ed38709',
)

maven_jar(
    name='com_google_truth_truth',
    artifact='com.google.truth:truth:0.32',
    sha1='e996fb4b41dad04365112786796c945f909cfdf7',
)

maven_jar(
    name='org_testng_testng',
    artifact='org.testng:testng:6.11',
    sha1='1fdd5e22f50b14f6d846163456e8c9a7657626fb',
)

maven_jar(
    name='com_beust_jcommander',
    artifact='com.beust:jcommander:1.64',
    sha1='456a985ac9b12d34820e4d5de063b2c2fc43ed5a',
)

maven_jar(
    name='org_yaml_snakeyaml',
    artifact='org.yaml:snakeyaml:1.17',
    sha1='7a27ea250c5130b2922b86dea63cbb1cc10a660c',
)

maven_jar(
    name='junit_junit',
    artifact='junit:junit:4.10',
    sha1='e4f1766ce7404a08f45d859fb9c226fc9e41a861',
)

person Community    schedule 18.05.2017    source источник
comment
это самый простой способ запустить testng?   -  person Setheron    schedule 08.11.2017


Ответы (2)


По умолчанию bazel test выводит только сводку результатов теста. Чтобы увидеть более подробный отчет, вы можете использовать --test_output all. Вы также можете установить --test_summary detailed.

Если это не даст вам желаемого результата, и вы предпочтете журнал testng, я могу придумать 2 альтернативы:

  1. Отключить песочницу.

  2. Объявите testng_report как входной файл (используя атрибут data из java_test). Bazel необходимо знать набор файлов ввода / вывода, и он удалит все, что не было заявлено заранее. Поскольку для java_test нет возможности объявить дополнительные файлы вывода, попробуйте объявить его как ввод, если его постоянное присутствие в пакете не доставляет неудобств. Это немного взломано, и я бы не стал его предпочитать.

Надеюсь это поможет.

person Irina Iancu    schedule 23.05.2017
comment
Спасибо, это действительно помогает. Правильно ли я сделаю вывод, что Bazel как бы ориентирован на JUnit для тестов Java? Похоже, что если бы я использовал JUnit, встроенный инструмент запуска тестов мог бы дать мне более подробный вывод (XML, трассировки стека сбоев и т. Д.) - person ; 24.05.2017
comment
Да это верно. У Bazel есть собственный пользовательский исполнитель тестов Junit для запуска тестов Java. - person Irina Iancu; 24.05.2017

Я думаю, что это новый вариант, но я смог использовать --sandbox_writable_path, чтобы сделать каталог в CI доступным для записи, а затем указать мой тестовый вывод для перехода в этот каталог.

--sandbox_writable_path=<a string> multiple uses are accumulated
For sandboxed actions, make an existing directory writable in the sandbox (if supported by the sandboxing implementation, ignored otherwise).
person daicoden    schedule 04.05.2020