我正在开发一个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) 是否有一个简单的工作流来编写将对象存储为.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文件,但即使这样,也有一些自动化可以促进这个过程).
我想测试我的一个函数给出了一个特定的消息(或警告或错误).
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)
不幸的是,他们两个目前都在通过.
为了澄清:这是一个最小的例子,而不是我正在测试的确切消息.如果可能的话,我希望避免为我的测试脚本添加复杂性(可能还有错误),因为需要为我要测试的每个新消息提供一个合适的正则表达式.
当我尝试在 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”文件夹中。我怎么解决这个问题?
我希望能够在不是r 包的项目中使用testthat和。实际上不使用任何第三方服务。只是一个普通的-old-r 源文件的集合covr
我正在努力找出这是否可行,如果可以,有关如何设置的说明已设置。
我发现的假设您正在编写一个 r 包。我喜欢避免这种开销。
现有技术:
当我的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递归搜索?
我有一个这样的功能:
func <- function(x) {
if (requireNamespace("broom", quietly = TRUE)) {
print(1)
} else {
print(2)
}
Run Code Online (Sandbox Code Playgroud)
我想使用testthat触发两种情况编写测试。但是,当然broom我的计算机上已经安装或未安装。该怎么办?
我想创建一个函数来运行一些检查并以类似的方式将诊断结果返回到终端devtools::check()。
devtools 使用颜色、多个其他符号(加载和“检查”等)。
有没有办法可以设计/编写这样的诊断程序?

我正在基于此探索 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 中运行测试?提前致谢。