标签: testthat

在R包中测试与用户的交互

我正在开发一个R包,其中一个功能是通过的标准输入来实现与用户的交互readline。我现在想知道如何测试此功能的行为,最好是使用testthat库。

似乎test_that函数假定答案是""用户输入的。我希望我可以测试用户可以输入的各种答案的行为条件。

下面是一个小的示例代码。在实际开发中,该marryme函数在单独的文件中定义,并导出到名称空间。 devtools::test()在最后一行让我出错,因为答案永远不会是。我想测试用户输入时函数是否正确返回true "y"

library(testthat)

test_that("input", {
  marryme <- function() {
    ans <- readline("will you marry me? (y/n) > ")
    return(ans == "y")
  }

  expect_false(marryme())  # this is good
  expect_true(marryme())   # this is no good
})
Run Code Online (Sandbox Code Playgroud)

r readline testthat r-package

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

针对存储的R对象进行测试

是否有一个简单的工作流来编写将对象存储为.rds或.rda的测试,以便将来运行的测试可以比较代码执行的结果与存储的对象?这样可以很容易地检查返回有些复杂值的函数是否仍然按预期运行.

例如,类似于:

test_obj(res <- lm(y ~ x, data.frame(x=1:3, y=5:7)))
Run Code Online (Sandbox Code Playgroud)

如果*extdata/test_obj.res.rds*不存在,将在*inst/extdata/test_obj.res.rds*中创建它,res从上面开始,但如果确实存在,则会相同/ all.equal等新生成的对象与从rds中恢复的对象.

我会发现这样的测试超级有用,我有点惊讶RUnit/svUnit/test没有实现某种类型的东西(我希望他们这样做,我只是没有找到它).

testthat::make_expectation是接近,但我更喜欢有自动存储/检索rds,而不是将文本表示复制粘贴到文件,我认为你应该如何使用testthat::make_expectation(我想我可以管道stdout()到一个. R文件,但即使这样,也有一些自动化可以促进这个过程).

r testthat unitizer

2
推荐指数
1
解决办法
210
查看次数

在testthat中测试精确的字符串

我想测试我的一个函数给出了一个特定的消息(或警告或错误).

good <- function() message("Hello")
bad <- function() message("Hello!!!!!")
Run Code Online (Sandbox Code Playgroud)

我希望第一个期望成功,第二个期望失败.

library(testthat)
expect_message(good(), "Hello", fixed=TRUE)
expect_message(bad(), "Hello", fixed=TRUE)
Run Code Online (Sandbox Code Playgroud)

不幸的是,他们两个目前都在通过.

为了澄清:这是一个最小的例子,而不是我正在测试的确切消息.如果可能的话,我希望避免为我的测试脚本添加复杂性(可能还有错误),因为需要为我要测试的每个新消息提供一个合适的正则表达式.

r testthat

2
推荐指数
1
解决办法
424
查看次数

“UseMethod(“xml_add_child”) 中的错误“test_dir 不起作用

当我尝试在 test_dir 函数中定义路径时,它显示错误:

Error in UseMethod("xml_add_child") : no applicable method for 'xml_add_child' applied to an object of class "NULL"
Run Code Online (Sandbox Code Playgroud)

我的 testthat.R 文件有以下几行:

library(testthat)
library(package)

options(testthat.junit.output_file = "test-out.xml")
test_dir("tests/testthat/0_utils/", reporter = 'junit')
test_package("package")
Run Code Online (Sandbox Code Playgroud)

我的测试位于“tests/testthat/0_utils”文件夹中。我怎么解决这个问题?

testing r testthat

2
推荐指数
1
解决办法
682
查看次数

r testthat 和 covr 在非包库中使用

我希望能够在不是r 包的项目中使用testthat和。实际上不使用任何第三方服务。只是一个普通的-old-r 源文件的集合covr

我正在努力找出这是否可行,如果可以,有关如何设置的说明已设置。

我发现的假设您正在编写一个 r 包。我喜欢避免这种开销。

现有技术:

  1. https://www.rstudio.com/resources/webinars/covr-bringing-test-coverage-to-r/
  2. https://walczak.org/2017/06/how-to-add-code-coverage-codecov-to-your-r-package/

r testthat covr

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

有没有办法递归地进行测试?

当我的R包目录结构直接在tests文件夹中有R文件时

.
+--Projroot
+---- R
|     -- routine1.R
|     -- routine2.R
+---- tests
      -- test_routine1.R
      -- test_routine2.R
Run Code Online (Sandbox Code Playgroud)

testthat捕获test_*.R文件,但是当测试本身依赖于大量文件时,拥有测试子目录会更加清晰

.
+--Projroot
+---- R
|     -- routine1.R
|     -- routine2.R
+---- tests
      |
      +---- test_routine1
      |     -- test_routine1.R
      |     -- help_file11
      |     -- help_file12
      +---- test_routine2
            -- test_routine2.R
            -- help_file21
            -- help_file22
Run Code Online (Sandbox Code Playgroud)

刚刚运行devtools::test()不会捕获test_*.R内部目录中的文件.

有没有办法testthat递归搜索?

r testthat

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

如何测试取决于是否安装软件包的行为

我有一个这样的功能:

func <- function(x) {
  if (requireNamespace("broom", quietly = TRUE)) {

    print(1)

  } else {

    print(2)

  }
Run Code Online (Sandbox Code Playgroud)

我想使用testthat触发两种情况编写测试。但是,当然broom我的计算机上已经安装或未安装。该怎么办?

r testthat

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

创建类似于 devtools::check() 的输出诊断(颜色和加载符号)

我想创建一个函数来运行一些检查并以类似的方式将诊断结果返回到终端devtools::check()

devtools 使用颜色、多个其他符号(加载和“检查”等)。

有没有办法可以设计/编写这样的诊断程序?

例子

r devtools testthat r-package

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

错误:“ansi_hyperlink_types”不是从“namespace:cli”导出的对象

我正在基于此探索 R 中的单元测试。

因此,我安装了该testthat软件包并编写了一个简单的函数和一个测试,如上面的链接中所述。这是代码

library(testthat)

f_to_c <- function(F_temp){
  C_temp <- (F_temp - 32) * 5/9
  return(C_temp)
}

#test
test_that(desc = "Fahrenheit to Celsius", code = {
  
  temp <- f_to_c(50)
  expect_that( object = temp, condition = equals(10) )
  expect_that( object = is.numeric(temp), condition = equals(TRUE) )
})
Run Code Online (Sandbox Code Playgroud)

这是我得到的

Error: 'ansi_hyperlink_types' is not an exported object from 'namespace:cli'
Run Code Online (Sandbox Code Playgroud)

导致此错误的原因可能是什么以及如何解决此问题?或者,是否有其他方法在 R 中运行测试?提前致谢。

testing unit-testing r testthat

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

标签 统计

r ×9

testthat ×9

r-package ×2

testing ×2

covr ×1

devtools ×1

readline ×1

unit-testing ×1

unitizer ×1