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

时间:2016-12-06 06:43:57

标签: r unit-testing rcpp

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

但是,我坚持这一步。我看过一些链接 Testing, R package by Hadley Wickham

CRAN:testthat, page 11

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

1 个答案:

答案 0 :(得分:7)

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

  

调用use_catch()将:

     
      
  1. 创建一个文件src / test-runner.cpp,确保testthat   包将了解如何运行包的单元测试,

  2.   
  3. 创建一个示例测试文件src / test-example.cpp,它展示了如何操作   您可以使用Catch编写单元测试,

  4.   
  5. 添加测试文件tests / testthat / test-cpp.R,确保testthat   将在devtools :: test()或。的调用期间运行已编译的测试   R CMD检查。

  6.         

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

         

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

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

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

您可能会将icd包视为动机的一个包 - 有关如何使用testthat包装器编写Catch单元测试的一个示例,请参阅this file