我正在开发一个包装包的R包,rmongodb并创建一个开发人员友好的界面来处理MongoDB.该包在proto内部使用.
我想通过一个名为proto的对象(环境)导出一个工厂方法MongoDB,其定义是:
MongoDB <- proto(
new = function(., ...) {
# Good stuff in here...
}
)
Run Code Online (Sandbox Code Playgroud)
在使用RStudio开发devtools期间以及在本地测试期间,这似乎不是问题.但是,我遇到了几个问题:
devtools::check()坚持import(MongoDB)在我的NAMESPACE文件中输入R CMD check"不需要命名空间依赖:'MongoDB'"的失败.
当我删除这个import指令R CMD check时testthat,即使我手动添加,在运行我的测试时仍未找到"找不到对象'MongoDB' export(MongoDB).但是,devtools::test()在RStudio中工作正常.
proto从R包导出对象(环境)的推荐方法是什么?
更新:
根据下面的Gabor建议,我确保MongoDB.Rd声明MongoDB为数据(链接有源).我仍然MongoDB在测试中看不到(使用中testthat).我的DESCRIPTION文件在这里,NAMESPACE就在这里.
我正在尝试使用该testthat软件包进行一些单元测试,但我似乎无法让它与rms软件包一起正常工作.以下示例:
library(rms)
set.seed(10)
ds <- data.frame(
ftime = rexp(200),
fstatus = sample(0:1,200,replace=TRUE),
x1 = runif(200),
x2 = runif(200),
x3 = factor(sample(LETTERS[1:3], size=200, replace=TRUE)))
ddist <- datadist(ds)
options(datadist="ddist")
s <- Surv(ds$ftime, ds$fstatus == 1)
fit <- cph(s ~ x1 + x2 + x3, data=ds)
Run Code Online (Sandbox Code Playgroud)
返回此错误:
设计错误(eval.parent(m)):找不到选项的数据集ddist(datadist =)
即使print(ddist)工作,选项("datadist")返回适当的变量.是否testthat有导致错误的不同变量范围?
我在我的包dir(Eclipse StatET)中启动了一个R控制台运行testthat:
library(testthat)
test_dir("inst/tests")
q()
Run Code Online (Sandbox Code Playgroud)
R CMD检查发生相同的错误--as-cran
我正在testthat为我的R包编写单元测试。我已经看到一些软件包作者(例如Rcpp和的软件包作者ggplot2)使用二进制文件分发其单元测试。但是,当我使用RStudio(0.98.1102)和devtools(1.7.0)构建软件包时,该tests文件夹未包含在zip文件中。我是否必须手动添加文件夹,还是可以通过设置某些选项来自动完成此文件夹?
顺便说一句:我在使用R v3.1.2和RTools v3.1.0.1942的Win7机器上。
我正在使用该testthat包为我的R包编写测试.我已按照http://r-pkgs.had.co.nz/tests.html上的说明进行操作(我相信).我用了
devtools::use_testthat()
Run Code Online (Sandbox Code Playgroud)
设置测试骨架.我已经创建了一个测试文件,tests/testthat文件名以test.当我devtools::test()在RStudio中运行或按Ctrl + Shift + T时,测试运行成功,但是当我运行R CMD check或Ctrl + Shift + E时,testthat找不到我的包.我收到了错误
> library(testthat)
>
> test_check("foo")
Loading required package: foo
Error in loadNamespace(name) : there is no package called 'foo'
Calls: test_check ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
In addition: Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
there is no package called 'foo'
Execution halted …Run Code Online (Sandbox Code Playgroud) 使用testthat/devtools基础结构时,跳过R包测试目录中所有测试的正确方法是什么?例如,如果没有与数据库的连接并且所有测试都依赖于该连接,我是否需要skip单独编写所有文件或者我可以在skip某处写一个?
我有一个标准的包装设置,看起来像
mypackage的/
- ......#其他包裹的东西
- 测试/
- testthat.R
- testthat /
- 测试thing1.R
- 测试thing2.R
起初我以为我可以在testthat.R文件中进行测试
## in testthat.R
library(testthat)
library(mypackage)
fail_test <- function() FALSE
if (fail_test()) test_check("package")
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,看起来调用devtools::test()只是忽略该文件.我想另一种方法是将所有测试存储在另一个目录中,但是有更好的解决方案吗?
我想测试一个函数在警告的顺序可以变化时会生成多个警告(4个或更多)。我最好的尝试是基于前瞻性RegExp匹配。简化为2条警告,我知道我的RegExp在单个字符串输出上工作,因为以下两个都是正确的:
grepl("(?s)(?=.*2)(?=.*1)", "* warn 1.\n* warn 2.", perl=TRUE)
grepl("(?s)(?=.*2)(?=.*1)", "* warn 2.\n* warn 1.", perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
但是,使用以下命令测试多个警告时,此方法不起作用 testhat::expect_warning
# The function generating warnings:
foo <- function() { warning("warn 1."); warning("warn 2.") }
foo()
Warning messages:
1: In foo() : warn 1.
2: In foo() : warn 2.
# Testing it
expect_warning( foo(), "(?s)(?=.*1)(?=.*2)", perl=TRUE)
Error: foo() does not match '(?s)(?=.*1)(?=.*2)'. Actual values:
* warn 1.
* warn 2.
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为的内部expect_warning功能正在像针对每个警告分别测试给定的RegExp一样-为什么expect_warning( ... all=TRUE )参数可能有意义。
不幸的是,我不能将它与RegExp之类的一起使用"1 | 2";如果只发出一个警告,则成功。 …
我现在刚刚开始使用R进行单元测试,到目前为止发现它很难进行雪橇测试。我想做的是进入R控制台,键入test()并进行测试,以对我的R包中的所有文件进行测试。
这是我的环境:
sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin15.2.0 (64-bit)
Running under: OS X 10.11.4 (El Capitan)
Run Code Online (Sandbox Code Playgroud)
和目录结构:
math
-- R
------ math.R
------ add.R
------ subtract.R
-- tests
------ testthat.R
------ testthat
---------- test_add.R
---------- test_subtract.R
---------- test_math.R
Run Code Online (Sandbox Code Playgroud)
带有以下相关文件样本:
数学
source('add.R')
source('subtract.R')
doubleAdd <- function(x){
return(add(x,x) + add(x,x))
}
Run Code Online (Sandbox Code Playgroud)
添加
add <- function(a,b){
return(a + b)
}
Run Code Online (Sandbox Code Playgroud)
验证
library(testthat)
library(math)
test_check("math")
Run Code Online (Sandbox Code Playgroud)
test_add.R
context('add tests')
test_that('1 + 1 = 2', {
expect_equal(2, add(1,1))
})
Run Code Online (Sandbox Code Playgroud)
错误:
在R控制台中,我得到以下结果:
library(devtools)
test() …Run Code Online (Sandbox Code Playgroud) 我有一个测试包来检查可能会或可能不会返回警告的函数,例如:
test_that("test", {
expect_true(is.na(log(NA)))
expect_true(is.na(log(-1)))
})
Run Code Online (Sandbox Code Playgroud)
我对检查天气出现警告不感兴趣.有没有一种方法,我怎么能告诉testthat给忽略了警告,并且运行时不显示出来devtools::test()?
我知道我可以打包每个功能expect_warning,或者suppressWarnings,但我喜欢做类似的事情
test_that("test", {
ignoreAllTheWarningsInside({
expect_true(is.na(log(NA)))
expect_true(is.na(log(-1)))
})
})
Run Code Online (Sandbox Code Playgroud)
不幸的是options(warn = -1),这似乎也没有用.
我正在使用 testthat 包来运行测试,到目前为止我对它非常满意。目前,我正在使用 test_file() 函数来运行所有测试并将其结果捕获为数据帧,然后进行一些额外的分析。
但是,我想做的一件事是从数据帧本身的故障中捕获错误消息。我真的很喜欢某些消息的描述性,并且在下游提供额外的信息会很棒。下面是我在想什么的一个例子。我想将“平均绝对差:1”消息捕获为df.
> df <- test_file(f)
1
1. Failure(@testthat.R#4): insert me here --------------------------------------
1 not equal to expected
Mean absolute difference: 1
> df
file context test nb failed error user system real
1 testthat.R insert me here 1 1 FALSE 0.004 0 0.004
Run Code Online (Sandbox Code Playgroud)
消息正在生成,在其中一个 Reporter 类中拦截这些消息似乎并不太费力,但是在浏览文档和源代码之后,我认为该功能不是内置的。
那么,是否可以使用当前版本的 testthat 来做到这一点?
如果没有,启用此功能需要做什么?我愿意为该项目做出贡献,但我不确定从哪里开始,因为我不太习惯 R 的 OOP。
感谢您的输入。
由于callr::r并callr::r_bg在干净的环境中启动后台进程,因此它们并不完全适合单元测试范例。通过 testthat 运行的 R 单元测试会加载包的当前开发版本,但单元测试启动的任何后台进程(例如,可能想要测试的管道工 API)将使用系统包。这是一些稍微混淆的输出来说明我的意思:
> system.file("plumber", "api", "entrypoint.R", package = "DemoPackage")
[1] "/path/to/dev/directory/for/DemoPackage/inst/plumber/api/entrypoint.R"
> callr::r(function() {system.file("plumber", "api", "entrypoint.R", package = "DemoPackage")})
[1] "/home/user_directory/R/x86_64-redhat-linux-gnu-library/3.6/DemoPackage/plumber/api/entrypoint.R"
Run Code Online (Sandbox Code Playgroud)
上述的变体(将 system.file 输出传递到plumber::plumb、使用plumber::plumb_api目录等)的结果都大致相同,这意味着尝试进行测试 API 开发版本的单元测试会失败。
devtools::load_all()我当前的解决方法是从 run by 的函数内运行callr::r_bg,并传入system.file(...)函数的路径,以便后台进程加载包的开发版本并找到管道工脚本的开发版本。这取得了好坏参半的成功——它在运行单元测试时按预期工作,除非运行单元测试时devtools::check()会出现错误(因为工作目录不同并devtools::load_all()中断)。
让此测试设置发挥作用的最佳方法是什么?我想解决方案将涉及获取目录或包路径并将其传递给调用者,或传递环境,但我不确定该朝哪个方向走。
更新
再次遇到这个问题,我在搜索时发现了自己的问题。一个新的问题是我正在通过covr包来测量单元测试覆盖率,它通过修改环境中的对象来跟踪使用情况来工作,因此不会跟踪后台会话中的使用情况。我不确定通过启动继承当前环境的后台会话是否可以免费实现正确的覆盖率跟踪(例如,该会话的覆盖率统计数据可能不会传达到工作会话的统计数据),但这至少是一个步骤更近了。