单元测试

  • bitcoin
  • 发布于 2025-05-02 12:30
  • 阅读 16

本文档介绍了Bitcoin Core的单元测试框架,该框架基于Boost单元测试框架,并详细说明了如何编译、运行单元测试,如何运行单独的测试,以及如何添加新的测试用例。此外,还介绍了单元测试中的日志记录、调试和处理段错误的方法。

单元测试

此目录下的源文件是单元测试用例。Boost 包含一个单元测试框架,并且由于 Bitcoin Core 已经使用了 Boost,所以直接使用这个框架是合理的,而不是要求开发者配置其他框架(我们希望尽可能减少创建单元测试的障碍)。

构建系统被设置为编译一个名为 test_bitcoin 的可执行文件,该文件运行所有的单元测试。测试库的主要源文件位于 util/setup_common.cpp

本文档中的示例假设构建目录名为 build。如果你的命名不同,你需要进行调整。

编译/运行单元测试

如果在生成 Bitcoin Core 构建系统期间满足了依赖关系,并且没有显式禁用测试,则会自动编译单元测试。

可以使用 ctest --test-dir build 运行单元测试,其中包括来自子树的单元测试。

运行 build/bin/test_bitcoin --list_content 可以获取完整的测试列表。

要手动运行单元测试,请启动 build/bin/test_bitcoin。在修改了测试文件后重新编译,运行 cmake --build build ,然后再次运行测试。如果你修改了一个非测试文件,使用 cmake --build build --target test_bitcoin 仅重新编译运行单元测试所需的内容。

要添加更多单元测试,可以将 BOOST_AUTO_TEST_CASE 函数添加到 test/ 目录中现有的 .cpp 文件中,或者添加新的 .cpp 文件来实现新的 BOOST_AUTO_TEST_SUITE 部分。

要手动运行 GUI 单元测试,请启动 build/bin/test_bitcoin-qt

要添加更多 GUI 单元测试,请将它们添加到 src/qt/test/ 目录和 src/qt/test/test_main.cpp 文件中。

运行单个测试

test_bitcoin 运行器接受来自 Boost 框架的命令行参数。要查看可能传递的参数列表,请运行:

build/bin/test_bitcoin --help

例如,要仅运行 getarg_tests 文件中的测试,并进行完整日志记录:

build/bin/test_bitcoin --log_level=all --run_test=getarg_tests

或者

build/bin/test_bitcoin -l all -t getarg_tests

或者仅运行 getarg_tests 中的 doubledash 测试

build/bin/test_bitcoin --run_test=getarg_tests/doubledash

--log_level= (或 -l)参数控制测试输出的详细程度。

test_bitcoin 运行器还接受 bitcoind 接受的一些命令行参数。使用 -- 来分隔这些参数集:

build/bin/test_bitcoin --log_level=all --run_test=getarg_tests -- -printtoconsole=1

两个破折号后的 -printtoconsole=1 将调试日志发送到标准终端输出,调试日志通常只输出到数据目录中的 debug.log

运行 test_bitcoin 会创建一个临时工作(数据)目录,其随机生成的路径名位于 test_common bitcoin/ 中,而 test_common bitcoin/ 又位于系统的临时目录中(参见 temp_directory_path)。此数据目录看起来像是标准 bitcoind 数据目录的简化形式。其内容会因测试而异,但始终会有一个 debug.log 文件。

可以使用 -testdatadir 选项指定临时数据目录的位置。这可以简化调试。使用的目录路径是附加了 /test_common bitcoin/<test-name>/datadir 的参数路径。如果需要,将创建目录路径。指定此参数还会导致在最后一次测试后不删除数据目录。例如,这对于查看测试完成后写入 debug.log 的内容很有用。(该目录在下一次测试运行开始时删除,因此不使用任何剩余状态。)

$ build/bin/test_bitcoin --run_test=getarg_tests/doubledash -- -testdatadir=/somewhere/mydatadir
Test directory (will not be deleted): "/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir"
Running 1 test case...

*** No errors detected
$ ls -l '/somewhere/mydatadir/test_common bitcoin/getarg_tests/doubledash/datadir'
total 8
drwxrwxr-x 2 admin admin 4096 Nov 27 22:45 blocks
-rw-rw-r-- 1 admin admin 1003 Nov 27 22:45 debug.log

如果运行整个测试套件,例如 --run_test=getarg_tests,或所有测试套件(通过不指定 --run_test),则将为每个单独的测试创建一个单独的目录。

添加测试用例

要将新的单元测试文件添加到我们的测试套件中,你需要将该文件添加到 src/test/CMakeLists.txtsrc/wallet/test/CMakeLists.txt 中,用于与钱包相关的测试。模式是为要为其创建单元测试的每个类或源文件创建一个测试文件。文件命名约定是 <source_filename>_tests.cpp,并且此类文件应将其测试包装在名为 <source_filename>_tests 的测试套件中。有关此模式的示例,请参见 uint256_tests.cpp

单元测试中的日志记录和调试

ctest --test-dir build 将写入日志文件 build/Testing/Temporary/LastTest.log。你还可以使用 --output-on-failure 选项在失败时自动显示失败测试的日志。对于详细运行单个测试,请参阅上面部分。

要从单元测试写入日志,你需要使用 Boost 提供的特定消息方法。最简单的是 BOOST_TEST_MESSAGE

对于调试,你可以使用 gdblldb 启动 test_bitcoin 可执行文件并开始调试,就像使用任何其他程序一样:

gdb build/bin/test_bitcoin
段错误

如果在测试运行期间遇到段错误,你可以通过运行 gdb ./build/bin/test_bitcoin,然后在 gdb 中使用 bt 命令来诊断发生错误的位置。

另一个可用于解决段错误的工具是 valgrind

如果出于任何原因要为此错误生成核心转储文件,也可以这样做。默认情况下,boost 测试运行程序将拦截系统错误并且不生成核心文件。要绕过此问题,请将 --catch_system_errors=no 添加到 test_bitcoin 参数,并确保已正确设置 ulimits(例如 ulimit -c unlimited)。

运行测试并遇到段错误现在应该会生成一个名为 core 的文件(在 Linux 平台上,文件名可能取决于 /proc/sys/kernel/core_pattern 的内容)。

然后,你可以使用以下命令浏览核心转储

gdb build/bin/test_bitcoin core

(gdb) bt  # 为发生段错误的位置生成回溯
  • 原文链接: github.com/bitcoin/bitco...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
bitcoin
bitcoin
江湖只有他的大名,没有他的介绍。