我有一些特别挑剔的代码,在不同的平台上表现不同,但如果在valgrind... 下运行也会表现不同我现在知道它
R -d valgrind下面的代码工作(抱歉缺少可重现的例子,你可能会发现编写一个很难),如果我没有运行valgrind,但是valgrind由于我们得到错误而不是警告而失败.
if (sessionInfo()$platform=="i686-pc-linux-gnu (32-bit)") {
expect_warning(update(g0, .~. +year), "failed to converge")
} else {
expect_error(update(g0, .~. +year), "pwrssUpdate did not converge in")
}
Run Code Online (Sandbox Code Playgroud)
我想要一个expect_warning_or_error()功能; 我想我可以通过黑客攻击,expect_error并且expect_warning看起来并不太复杂,但我欢迎其他建议.
或者,我可以弄清楚如何检测我是否正在运行valgrind(似乎更难).
一种可重复的例子:
library(testthat)
for (i in c("warning","stop")) {
expect_warning(get(i)("foo"))
expect_error(get(i)("foo"))
}
Run Code Online (Sandbox Code Playgroud) 我在R中使用了优秀的testthat包.我的问题是,在使用test_file时,我无法在正在测试的代码中看到message()函数的任何输出.例如,假设我在名为test_message.R的文件中有以下代码
f <- function() {
message ("Message: Hello world")
cat ("Cat: Hello world\n")
return (1)
}
test_that ("message shows up", {
expect_equal(f(), 1)
})
Run Code Online (Sandbox Code Playgroud)
我按如下方式运行test_file并获得下面的输出
> test_file("test_message.R")
Cat: Hello world
.
Run Code Online (Sandbox Code Playgroud)
所以我没有看到来自message()的文本.
但是,当我自己运行代码时,我确实看到了:
> f()
Message: Hello world
Cat: Hello world
[1] 1
Run Code Online (Sandbox Code Playgroud)
我知道默认情况下,message()写入stderr和cat写入stdout,我猜测test_file"拦截"stderr来测试警告和错误中的文本.有什么方法可以配置东西,所以我在控制台上看到message()文本?
任何人都可以使用GitLab.com持续集成工具运行对最小R包进行测试的test吗?我的尝试:
https :
//gitlab.com/djchapman/CI_example这是我正在使用的.gitlab-CI.yml文本,
image: rocker/rstudio
test:
script:
- R -e 'install.packages(c("devtools", "testthat"))'
- R CMD build . --no-build-vignettes --no-manual
- PKG_FILE_NAME=$(ls -1t *.tar.gz | head -n 1)
- R CMD check "${PKG_FILE_NAME}" --no-build-vignettes --no-manual
- R -e 'devtools::test()'
Run Code Online (Sandbox Code Playgroud)
从本网站改编而成。我意识到devtools具有依赖关系,在安装软件包时可能需要包括这些依赖关系,我尝试过这样做,但是git2r的库似乎未正确安装,现在我想知道我是否要解决这个问题。谢谢。
任何人都可以帮助我解释为什么 expect_that 如果[]添加到停止消息不起作用,即f1工作但f2不工作.
library(testthat)
f1 <- function(x){
if( x >= 1 ){
stop("error 1")
}
}
expect_that(f1(x=1.4), throws_error("error 1"))
f2 <- function(x){
if( x >= 1 ){
stop("error [1]")
}
}
expect_that(f2(x=1.4), throws_error("error [1]"))
Run Code Online (Sandbox Code Playgroud) 我已经在我的R包中弃用了几个函数,方法.Deprecated("new_function_name")是在函数的开头添加一行。对于那些不推荐使用的功能,我进行了完整的单元测试。现在,这些试验产生警告(因为过时消息)和泥泞起来的结果testthat::test()和devtools::check().
我可以删除不赞成使用的函数的测试范围,但是似乎只要用户仍然可以调用函数,我就应该保留测试范围。有什么方法可以保留测试,但又可以避免结果混乱check()吗?例如,告诉testthat他们如果expect_equal()仍然有效,而忽略弃用警告,就算它们为合格。
我正在testthat为我的 R 包编写测试。我的一项测试使用jitter. 我想确保测试是可重复的。
我放 set.seed(1014)
library(testthat)的./tests/testthat.R; 或者context("Test)./tests/testthat/test-function.R;或者test_that("Example works"){jitter(1)}))in ./tests/testthat/test-function.R?为什么?
Tibbles(来自tidyverse)可以包含列表列,这对于包含嵌套数据帧或传统上在 data.frame 中找不到的对象非常有用。
这是一个例子:
\n\nlibrary("dplyr")\n\nnested_df <-\n iris %>%\n group_by(Species) %>%\n tidyr::nest() %>%\n mutate(model = purrr::map(data, lm, formula = Sepal.Length ~ .))\n\nnested_df\n# # A tibble: 3 x 3\n# Species data model \n# <fct> <list> <list> \n# 1 setosa <tibble [50 \xc3\x97 4]> <S3: lm>\n# 2 versicolor <tibble [50 \xc3\x97 4]> <S3: lm>\n# 3 virginica <tibble [50 \xc3\x97 4]> <S3: lm>\nRun Code Online (Sandbox Code Playgroud)\n\n我正在编写一些测试testthat:如何测试此类 data.frames 之间的相等性?
testthat::expect_equal不起作用,因为all.equal两者dplyr::all_equal都失败了:
all.equal(nested_df, nested_df)\n# …Run Code Online (Sandbox Code Playgroud) 我正在为一个包编写单元测试,并且有一些测试,我不希望测试在失败时抛出错误,而是发出警告。
这不是我真正的代码,但假设我想测试如下内容:
add_x_y <- function(x, y) x + y
expect_equal( add_x_y(2, 2), 3 )
Run Code Online (Sandbox Code Playgroud)
输出是一个错误:
Error: add_x_y(2, 2) not equal to 3.
1/1 mismatches
[1] 4 - 3 == 1
Run Code Online (Sandbox Code Playgroud)
是否有变体或替代函数会在此检查中引发警告而不是错误?
为什么这个测试没有通过?
my_fun <- function(x){
if(x > 1){stop("my_fun() must be called on values of x less than or equal to 1")}
x
}
library(testthat)
expect_error(my_fun(2),
"my_fun() must be called on values of x less than or equal to 1")
Run Code Online (Sandbox Code Playgroud)
它返回错误消息:
错误:error$message 不匹配“必须在 x 小于或等于 1 的值上调用 my_fun()”。实际值:“必须在 x 小于或等于 1 的值上调用 my_fun()”
如果您()从函数和测试中都删除了,则测试确实通过了,这让我认为这与括号有关。
我正在维护旧版代码库,并被迫使用一些肮脏的技巧来解决一些破坏游戏的问题。hack需要我手动编辑RcppExports文件。是的,这听起来很愚蠢,但是它可以正常工作,而且我也不会经常更改界面,因此它仍然有效。
我使用来测试我的软件包devtools::test,该函数testthat::test_dir在幕后进行调用,后者依次调用devtools::load_all“模拟在安装和加载软件包时发生的情况library()”。这会导致我手工制作的RcppExports文件被擦除,并被一些自动生成的文件替换,从而导致很多错误。
所以我在这里,正在寻找另一种可解决由黑客引起的问题的黑客工具。有什么建议么?