添加和运行测试

一套高质量的测试对于确保代码库的正确性和健壮性至关重要。在这里,我们提供了如何运行单元测试以及如何添加新测试的说明。

目录

添加新的单元测试

Python 包:pytest

将您的测试添加到以下目录中:

请参阅 PyTest 教程,了解如何为 Python 代码编写测试。

您可以按照本节中的说明尝试运行您的测试。

C++:Google Test

将您的测试添加到目录 tests/cpp/ 中。请参阅 此关于使用 Google Test 的优秀教程

您可以按照本节中的说明尝试运行您的测试。注意:需要 Google Test 1.8.1 版或更高版本。

JVM 包:JUnit / scalatest

XGBoost 的 JVM 包(XGBoost4J / XGBoost4J-Spark)使用 Maven 标准目录布局。具体来说,JVM 包的测试位于以下位置:

要为 Java 代码编写测试,请参阅 JUnit 5 教程。要为 Scala 编写测试,请参阅 Scalatest 教程

您可以按照本节中的说明尝试运行您的测试。

R 包:testthat

将您的测试添加到目录 R-package/tests/testthat 中。请参阅 此关于 testthat 的优秀教程

您可以按照本节中的说明尝试运行您的测试。

本地运行单元测试

R 包

在项目根目录下运行

python ./ops/script/test_r_package.py --task=check

该命令会构建并检查 XGBoost R 包。或者,如果您只想运行测试,在安装 XGBoost 后可以使用以下命令:

cd R-package/tests/
Rscript testthat.R

JVM 包

使用 Maven

mvn test

Python 包:pytest

要运行 Python 单元测试,首先安装 pytest

pip3 install pytest

然后按照 构建共享库 中的说明编译 XGBoost。最后,在项目根目录下调用 pytest

# Tell Python where to find XGBoost module
export PYTHONPATH=./python-package
pytest -v -s --fulltrace tests/python

此外,要测试 CUDA 代码,请运行

# Tell Python where to find XGBoost module
export PYTHONPATH=./python-package
pytest -v -s --fulltrace tests/python-gpu

(在此步骤中,您应该已启用 CUDA 编译 XGBoost。)

用于测试 Dask 和 PySpark 等分布式框架

# Tell Python where to find XGBoost module
export PYTHONPATH=./python-package
pytest -v -s --fulltrace tests/test_distributed

C++:Google Test

要在运行 CMake 时启用测试,请构建并运行 C++ 单元测试

cmake -B build -S . -GNinja -DGOOGLE_TEST=ON -DUSE_DMLC_GTEST=ON -DUSE_CUDA=ON -DUSE_NCCL=ON
cmake --build build
cd ./build
./testxgboost

诸如 USE_CUDAUSE_DMLC_GTEST 等标志是可选的。有关如何从源代码构建 XGBoost 的更多信息,请参阅 从源代码构建。您也可以使用 ctest 工具运行所有单元测试,该工具提供了更高的灵活性。例如

ctest --verbose

如果您需要使用 VS 调试器在 Windows 上调试错误,您可以将 gtest 标志附加到 test_main.cc

::testing::GTEST_FLAG(filter) = "Suite.Test";
::testing::GTEST_FLAG(repeat) = 10;

清理器:检测内存错误和数据竞争

默认情况下,清理器捆绑在 GCC 和 Clang/LLVM 中。可以使用 GCC >= 4.8 或 LLVM >= 3.1 启用清理器,但某些发行版可能会单独打包清理器。以下是受支持的清理器及其相应的库名称列表:

  • 地址清理器:libasan

  • 未定义行为清理器:libubsan

  • 内存泄漏清理器:liblsan

  • 线程清理器:libtsan

内存清理器是 LLVM 独有的,因此 XGBoost 不支持。对于像 gcc-9 这样的最新编译器,当指定清理器标志时,编译器驱动程序应该能够自动链接运行时库。

如何使用清理器构建 XGBoost

可以通过指定 -DUSE_SANITIZER=ON 来构建支持清理器的 XGBoost。默认情况下,当您打开 USE_SANITIZER 标志时,会使用地址清理器和内存泄漏清理器。您始终可以通过向 ENABLED_SANITIZERS 提供以分号分隔的清理器列表来更改默认设置。请注意,线程清理器与其他两个清理器不兼容。

cmake -DUSE_SANITIZER=ON -DENABLED_SANITIZERS="address;undefined" /path/to/xgboost

默认情况下,CMake 将在常规系统路径中搜索清理器,您也可以提供指定的 SANITIZER_PATH。

cmake -DUSE_SANITIZER=ON -DENABLED_SANITIZERS="address;undefined" \
-DSANITIZER_PATH=/path/to/sanitizers /path/to/xgboost

如何在 CUDA 支持下使用清理器

在 CUDA 上使用地址清理器 (asan) 运行 XGBoost 将引发内存错误。要正确地将 asan 与 CUDA 结合使用,您需要通过 ASAN_OPTIONS 环境变量配置 asan

ASAN_OPTIONS=protect_shadow_gap=0 ${BUILD_DIR}/testxgboost

其他清理器运行时选项

默认情况下,未定义行为清理器不会打印回溯。您可以通过导出环境变量来启用它

UBSAN_OPTIONS=print_stacktrace=1 ${BUILD_DIR}/testxgboost

有关详细信息,请查阅 清理器的官方文档