如何在R软件包中为cpp函数编写测试?

6
为了加速R包中的某些功能,我已经使用Rcpp重新编写了它们,并成功地将这些cpp函数嵌入到该包中。下一步是测试cpp函数是否能够输出与R中原始函数相同的结果。因此,编写测试是必要的。
然而,在这一步上我卡住了。我阅读了一些链接Testing, R package by Hadley WickhamCRAN: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的原始函数。如何测试这两个函数是否相等?

当你说“在这一点上,我认为[...]但是卡住了”时,你的意思是什么 - 是遇到了错误或其他问题吗? - nrussell
请提供一个最小化可重现的示例。 - coatless
@nrussell,完全没有错误,只是意味着我不知道如何继续下去,有什么直觉可以帮助我继续吗? - Bratt Swan
2
你会考虑由Hadley以外的人编写的文档吗?或者你有没有想过查看使用Rcpp的864个CRAN软件包中的现有测试? - Dirk Eddelbuettel
3
如果我理解正确,这个问题特别关注如何将捆绑的Catch库与“testthat”一起使用,这是一个相对较新的功能,并且还没有被许多软件包使用。 - Kevin Ushey
1个回答

8

?use_catch 的文档试图在此处准确描述 testthat 的测试基础设施的工作方式,因此我将只将其复制为答案:

调用 use_catch() 将会:

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

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

  3. 添加一个测试文件 tests/testthat/test-cpp.R,以确保 testthat 在 devtools::test() 或 R CMD check 调用期间运行您的编译测试。

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 单元测试的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接