如何编写测试用例以使用r中的testthat检查函数是否正常工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何编写测试用例以使用r中的testthat检查函数是否正常工作?相关的知识,希望对你有一定的参考价值。

我有很多功能可以检查每个功能是否工作正常。我对使用“ testthat”包非常陌生。首先,我的代码必须从某个位置读取数据

  baseData = fread(file = "./Data/ABC.csv", data.table = FALSE, stringsAsFactors = FALSE, showProgress = FALSE, encoding = "UTF-8")

接下来,我要基于特定列过滤数据,例如ab_010 =10。这是该代码,

  baseData = baseData %>% filter(., ab_010 == 10)

现在,我想使用testthat检查过滤是否正确完成。我也经历了很多R突击,例如https://b-rodrigues.github.io/fput/unit-testing.html。但是对于如何将此案例应用于我的场景,我没有一个明确的想法。这是我使用testthat编写的代码,

test_that("To check Base data is being read correctly",
  expected <- fread(file = "./Data/ABC.csv", data.table = FALSE, stringsAsFactors = FALSE, showProgress = FALSE, encoding = "UTF-8")
  actual <- fread("./Data/ABC.csv")
  expect_equal(expected,actual)
)

测试失败!我需要在哪里进行更改?

答案

(至少有两种方法可以测试像这样的功能的行为:

  1. 运行功能,并仔细检查输出。如果您完全确定输出正确无误,则可以保存此输出(例如,使用dput),然后将此正确版本与该函数返回的版本进行比较。
  2. 独立于函数而实现相同的逻辑,并将函数的输出与该独立代码的输出进行比较。

第一个可能更健壮,因为对于情况2,可以在测试和函数中实现相同的错误。但是,这通常会更耗时,因为这还取决于您确定保存的输出是否正确。

另一答案

我已经找到了解决方案。首先,让我分享我在如何使用“ testthat”方面有丰富知识的资源。https://r-pkgs.org/tests.html。作者本人对testthat的网站有很好的解释。

什么是testthat,如何将其用于单元测试?我读了很多关于testthat的文章,这是对此的简要说明。首先,“ testthat”是R中用于进行单元测试的软件包。它主要包含三个概念,

  1. 期望
  2. 测试
  3. 文件

期望] >>

所以测试的基本单位是期望。这些不过是测试用例或我们要测试的内容。期望代码应以Expect_开头。 testthat软件包中有15个以上的期望。最常用的是“ expect_that”。其语法为expect_that(实际结果,预期结果)

。其他常用的期望值为expect_true(),expect_false(),expect_output()等...

Test

测试不过是我们要测试的期望。使用关键字test_that()完成test_that的语法为test_that(关于测试的描述,测试的条件(期望))>>。

[文件

]

文件是测试文件。要测试的文件应以test_filename开头。

如何知道测试是否执行?

如果运行了该代码并执行了下一行,则测试成功。如果测试失败,则返回错误消息。

我如何解决我的问题?

我的问题是检查过滤是否正确进行。这是该代码,

test_that("Filtering of ab010 == 10 as expected",
  require("dplyr")
  expect_true(unique(baseData[,"ab010"]) == 10)
)

如果测试失败,则会引发类似这样的错误消息

Error: Test failed: 'Filtering of ab010 == 10 as expected'
* unique(baseData[, "ab010"]) == 10 isn't true.

这解决了我的问题。

以上是关于如何编写测试用例以使用r中的testthat检查函数是否正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

用例结构优化心得

严格捕获测试用例以进行单元测试

是否有一个 testthat expect_* 函数用于比较两个对象的行为?

我们可以使用 testthat 包中的函数来测试向量的元素吗?

如何将 testthat 测试应用于我的包中与特定命名模式匹配的所有函数?

为 Java 中的自定义检查异常编写 JUnit 测试用例?