如何在R包中编写cpp函数的测试?

问题描述 投票:5回答:1

为了加速R包中的某些功能,我使用Rcpp在cpp函数中重新编码它们,并成功地将这些cpp函数嵌入到这个包中。下一步是测试cpp函数是否可以输出与R中的原始函数相同的结果。因此编写测试是必要的。

但是,我坚持这一步。我已经阅读了一些链接Testing, R package by Hadley Wickham

CRAN:testthat, page 11

我所做的是我运行devtools::use_testthat()to创建一个tests / testthat目录。然后,运行use_catch(dir = getwd())to添加测试文件tests / testthat / test-cpp.R。在这一点上,我认为expect_cpp_tests_pass()可能会工作,但只是坚持下去。如果我有原始函数add_inflowadd_inflow_Cpp。如何测试这两个函数是否相等?

r unit-testing rcpp
1个回答
7
投票

?use_catch的文档试图准确描述testthat的测试基础设施如何在这里工作,所以我只是复制它作为答案:

调用use_catch()将:

  1. 创建一个文件src / test-runner.cpp,它确保testthat包能够理解如何运行包的单元测试,
  2. 创建一个示例测试文件src / test-example.cpp,它展示了如何使用Catch编写单元测试,以及
  3. 添加测试文件tests / testthat / test-cpp.R,确保在调用devtools :: test()或R CMD检查期间运行已编译测试的test。

可以将C ++单元测试添加到包的src /目录中的C ++源文件中,其格式类似于使用testthat测试的R代码。

编译包时,将使用用于运行这些测试的线束的单元测试编译到R包中,使用C入口点run_testthat_tests()。 testthat将使用该入口点在检测到时运行单元测试。

简而言之,如果您想使用Catch编写自己的C ++单元测试,可以按照自动生成的test-example.cpp文件的示例进行操作。 testthat将自动运行您的测试,并在常规devtools::test()过程中报告失败。

请注意,Catch的使用专门用于在C ++级别编写单元测试。如果您想编写R测试代码,那么Catch将与您的用例无关。


你可以看一下作为动机的一个包是icd包 - 请参阅this file,了解如何使用testthat包装器编写Catch单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.