缺少 SEGFAULT 信息的 bazel 测试

bazel test lacking SEGFAULT information

我们目前正在从基于 CMake 的构建迁移到 bazel。对于单元测试,我们使用我们自己实施的框架。

处理 SEGFAULT 时,ctest 给出以下输出:

The following tests FAILED:
    19 - SomeTest (SEGFAULT)
Errors while running CTest

但是,当使用完全相同的构建选项和源执行完全相同的测试时,bazel 输出如下所示:

//services/SomeTest:test                                                FAILED in 0.2s
  /root/.cache/bazel/_bazel_root/b343aed36e4de4757a8e698762574e37/execroot/repo/bazel-out/k8-fastbuild/testlogs/SomeTest/test/test.log

其他输出只是测试的常规打印输出,与 SEGFAULT 无关。 SomeTest/test/test.log.

的内容也是如此

我尝试了 bazel test 的以下选项:--test_output=all--test_output=errors--verbose_test_summary--verbose_failures

我在这里错过了什么?

您看到的输出来自 CTest,而不是来自被测应用程序。如果你想看到有用的信息,你需要一些测试框架来提供给你。这是普通测试和 Catch2 测试之间的比较。

设置

test_vanilla.cc

int main() { return 1 / 0; }

test_catch2.cc

#include <catch2/catch.hpp>

TEST_CASE("Hello") { REQUIRE(1 / 0); }

工作区

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "catch2",
    sha256 = "3cdb4138a072e4c0290034fe22d9f0a80d3bcfb8d7a8a5c49ad75d3a5da24fae",
    strip_prefix = "Catch2-2.13.7",
    urls = ["https://github.com/catchorg/Catch2/archive/v2.13.7.tar.gz"],
)

建造

cc_test(
    name = "test_vanilla",
    srcs = ["test_vanilla.cc"],
)

cc_test(
    name = "test_catch2",
    srcs = ["test_catch2.cc"],
    defines = ["CATCH_CONFIG_MAIN"],
    deps = ["@catch2"],
)

测试

没有测试框架

现在让我们运行进行测试。

❯ bazel test //:test_vanilla
[...]
//:test_vanilla        FAILED in 0.3s

test.log

exec ${PAGER:-/usr/bin/less} "[=15=]" || exit 1
Executing tests from //:test_vanilla
-----------------------------------------------------------------------------

你可以看到测试失败了,因为它没有return 0(因为它通过非法除以零而失败。 如果您安装了 systemd-coredump(并启用了 coredumps),您可以通过

获取一些信息
❯ coredumpctl -1 debug
[...]
Core was generated by `/home/laurenz/.cache/bazel/_bazel_laurenz/be59967ad4f5a83f16e874b5d49a28d5/sand'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x0000561398132668 in main ()
(gdb)

赶上2

如果您有像 CTest 或 Catch2 这样的测试框架,它将提供更多信息,因此您甚至不需要自己检查 coredump。测试日志将提供有问题的文件和行以及信号。

❯ bazel test //:test_catch2
[...]
//:test_catch2        FAILED in 0.2s

test.log

exec ${PAGER:-/usr/bin/less} "[=18=]" || exit 1
Executing tests from //:test_catch2
-----------------------------------------------------------------------------

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test_catch2 is a Catch v2.13.7 host application.
Run with -? for options

-------------------------------------------------------------------------------
Hello
-------------------------------------------------------------------------------
test_catch2.cc:3
...............................................................................

test_catch2.cc:3: FAILED:
due to a fatal error condition:
  SIGFPE - Floating point error signal

===============================================================================
test cases: 1 | 1 failed
assertions: 1 | 1 failed