标签: testthat

expect_error_or_warning在testthat?

我有一些特别挑剔的代码,在不同的平台上表现不同,但如果在valgrind... 下运行也会表现不同我现在知道它

  • 如果在不在valgrind下的 32位Linux上运行,则会发出警告
  • 如果在其他地方运行在32位Linux上运行,则会出错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)

unit-testing r testthat

5
推荐指数
1
解决办法
702
查看次数

R testthat包:如何在使用test_file()时看到message()的输出

我在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()文本?

r testthat

5
推荐指数
2
解决办法
2258
查看次数

使用R TestThat软件包的GitLab CI

任何人都可以使用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的库似乎未正确安装,现在我想知道我是否要解决这个问题。谢谢。

r gitlab testthat

5
推荐指数
1
解决办法
696
查看次数

函数expect_that从testthat遇到错误

任何人都可以帮助我解释为什么 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 testthat

4
推荐指数
1
解决办法
200
查看次数

R软件包中不赞成使用的功能的单元测试在检查期间引起警告

我已经在我的R包中弃用了几个函数,方法.Deprecated("new_function_name")是在函数的开头添加一行。对于那些不推荐使用的功能,我进行了完整的单元测试。现在,这些试验产生警告(因为过时消息)和泥泞起来的结果testthat::test()devtools::check().

我可以删除不赞成使用的函数的测试范围,但是似乎只要用户仍然可以调用函数,我就应该保留测试范围。有什么方法可以保留测试,但又可以避免结果混乱check()吗?例如,告诉testthat他们如果expect_equal()仍然有效,而忽略弃用警告,就算它们为合格。

r testthat deprecation-warning

4
推荐指数
2
解决办法
178
查看次数

我在哪里为 R 包中的测试指定随机种子?

我正在testthat为我的 R 包编写测试。我的一项测试使用jitter. 我想确保测试是可重复的。

我放 set.seed(1014)

  1. 之前或之后library(testthat)./tests/testthat.R; 或者
  2. 在每个测试文件的顶部(之前或之后context("Test./tests/testthat/test-function.R;或者
  3. 在每个单元测试的顶部(在test_that("Example works"){jitter(1)}))in ./tests/testthat/test-function.R?

为什么?

r devtools testthat r-package

4
推荐指数
1
解决办法
469
查看次数

使用列表列或嵌套 data.frame 测试 tibbles 的相等性

Tibbles(来自tidyverse)可以包含列表列,这对于包含嵌套数据帧或传统上在 data.frame 中找不到的对象非常有用。

\n\n

这是一个例子:

\n\n
library("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>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在编写一些测试testthat如何测试此类 data.frames 之间的相等性?

\n\n

testthat::expect_equal不起作用,因为all.equal两者dplyr::all_equal都失败了:

\n\n
all.equal(nested_df, nested_df)\n# …
Run Code Online (Sandbox Code Playgroud)

equality r testthat

4
推荐指数
1
解决办法
1165
查看次数

在 testthat 中抛出警告而不是错误

我正在为一个包编写单元测试,并且有一些测试,我不希望测试在失败时抛出错误,而是发出警告。

这不是我真正的代码,但假设我想测试如下内容:

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)

是否有变体或替代函数会在此检查中引发警告而不是错误?

r testthat

4
推荐指数
1
解决办法
457
查看次数

错误消息中的括号导致 expect_error 测试失败

为什么这个测试没有通过?

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()”

如果您()从函数和测试中都删除了,则测试确实通过了,这让我认为这与括号有关。

r testthat

3
推荐指数
1
解决办法
206
查看次数

使用devtools :: test时避免重新生成RcppExports

我正在维护旧版代码库,并被迫使用一些肮脏的技巧来解决一些破坏游戏的问题。hack需要我手动编辑RcppExports文件。是的,这听起来很愚蠢,但是它可以正常工作,而且我也不会经常更改界面,因此它仍然有效。

我使用来测试我的软件包devtools::test,该函数testthat::test_dir在幕后进行调用,后者依次调用devtools::load_all“模拟在安装和加载软件包时发生的情况library()”。这会导致我手工制作的RcppExports文件被擦除,并被一些自动生成的文件替换,从而导致很多错误。

所以我在这里,正在寻找另一种可解决由黑客引起的问题的黑客工具。有什么建议么?

r devtools rcpp testthat r-package

3
推荐指数
1
解决办法
48
查看次数