缺少 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
我们目前正在从基于 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