添加和运行测试
一套高质量的测试对于确保代码库的正确性和健壮性至关重要。在这里,我们提供了如何运行单元测试以及如何添加新测试的说明。
目录
添加新的单元测试
Python 包:pytest
将您的测试添加到以下目录中:
tests/python-gpu/ (如果您正在测试 GPU 代码)
tests/test_distributed. (如果使用了分布式框架)
请参阅 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_CUDA
、USE_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
有关详细信息,请查阅 清理器的官方文档。