【问题标题】:Bazel TestNG XML outputBazel TestNG XML 输出
【发布时间】:2020-05-04 12:58:20
【问题描述】:

我有一个小型 Java 项目:一个依赖于 Google Truth、Google Guava、JSR305 注释和用于单元测试的 TestNG 的包。我在使用 Bazel 运行测试时遇到了一些麻烦。我可以创建一个 java_test 规则并使用bazel test 运行它,但是 Bazel 的 XML 输出为我提供了整个测试套件的一次通过/失败,没有关于单个失败的信息。来自 TestNG 的 XML 与沙箱一起被清理。

为了解决这个问题,我为 TestNG 的 XML 创建了一个 genrule,但文档明确指出“不要使用 genrules 进行测试”,所以我想知道是否有更好的方法。

我的 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'
)

...我怀疑还有更好的方法来处理类路径。为了完整起见,我的 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',
)

【问题讨论】:

  • 这是最简单的运行 testng 的方法吗?

标签: bazel


【解决方案1】:

默认情况下,bazel test 将仅输出测试结果的摘要。要查看更详细的报告,您可以使用--test_output all。你也可以设置--test_summary detailed

如果这不能为您提供所需的输出并且您更喜欢 testng 日志,我可以想到 2 个替代方案:

  1. 禁用沙盒。

  2. 将 testng_report 声明为输入文件(使用 datajava_test 的属性)。 Bazel 需要知道输入/输出文件的集合 并将删除未事先声明的所有内容。因此 java_test没有办法声明额外的输出文件,试试 如果在包中始终包含它,则将其声明为输入 不是不便。这有点骇人听闻,我不喜欢它。

希望这会有所帮助。

【讨论】:

  • 谢谢,这确实有帮助。我认为 Bazel 有点适合用于 Java 测试的 JUnit 是否正确?看起来如果我使用的是 JUnit,内置的测试运行器可能会给我更详细的输出(XML、失败堆栈跟踪等)
  • 是的,没错。 Bazel 有自己的自定义 Junit 测试运行器来运行 Java 测试。
【解决方案2】:

我认为这是一个新选项,但我能够使用 --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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多