我正在开发一个新的包,我有一些单元测试要写。 tests/
和inst/tests/
之间有什么区别?应该分别使用哪些东西?
特别是,我在http://journal.r-project.org/archive/2011-1/RJournal_2011-1_Wickham.pdf中看到Hadley建议使用inst/tests/
“这样的用户
还可以访问它们,“然后在tests/
中添加一个引用来运行它们。但为什么不把它们全部放在tests/
中?
答案 0 :(得分:9)
@hadley的意思是在二进制包中,tests/
不存在;它只在源包中。惯例是,inst/
中的任何内容在安装时都会复制到程序包顶级目录中,因此inst/tests/
将在二进制和已安装的程序包目录结构中以/tests
的形式提供。
请参阅我的 permute 包作为示例。我使用@ hadley的 testthat 包作为学习经验和我的包测试。该套餐位于CRAN。抓住源代码tarball并注意它同时包含tests/
和inst/tests/
,然后获取Windows二进制文件并注意到只有tests/
并且它是inst/tests
的副本在消息来源中。
严格来说,只有tests/
由R CMD check
等运行,因此在开发过程中以及作为生产包中的检查,您需要tests/
中的代码来测试包裹执行的声明或其他单位试验。您当然可以在tests/
中运行代码/inst/tests/
中运行R脚本实际执行测试,和这样做会产生副作用,使测试代码可用于打包用户。
我看待事物的方式至少需要tests/
,您是否需要inst/tests
取决于您希望如何开发包以及您正在使用的单元测试代码/包。 inst/tests/
是@hadley所倡导的东西,但它远远不是CRAN大部分的标准。
答案 1 :(得分:5)
正如'Writing R Extensions'所说,只安装了inst/tests
。因此,只有那些可用于两者包的源版本及其二进制(已安装)表单的测试。
否则tests/
当然适用于通常的R CMD check
测试。现在,Martin Maechler曾经从tests/
开发了一个'hook'脚本来使用inst/tests
,我一直在我的一些软件包中使用它,允许在用户查看源代码时调用它们,以及事后。事实上,你可以将一组测试转移到另一组测试中,并充分利用这两个测试。
编辑:这是我们的RProtoBuf软件包从tests /:https://github.com/eddelbuettel/rprotobuf/blob/master/tests/runUnitTests.R调用inst / tests / tests所做的工作的链接。基本的想法是由于Martin所说的。