提示:用testthat测试代码

信息世界|2018年5月30日

在这一集的Do More with R,学习如何自动化测试你的R功能与哈德利韦翰的测试包。

版权©2018足球竞彩网下载

你好,我是Sharon Machlis, IDG通讯编辑数据分析总监。我现在是在《用R做更多事情:用testthat测试代码》的第三集。
你写了一个函数。你在几个不同的值上运行这个函数,你得到了你想要的结果,你很高兴。
但是之后你需要做一个改变,所以需要在所有这些不同的值上再次运行这个函数,以确保你没有破坏任何东西。如果有超过一个或两个的测试值和代码更改,它会很快变得很烦人。
这其中testthat包进来的,它的创造者,哈德利威克姆说testthat“试图使测试的乐趣成为可能,让你从编写测试得到内脏满意。”老实说,我不知道如果我能找到测试代码的乐趣。但是,testthat确实使相当痛苦 - 和很多优于一次性手动检查。
让我给你演示一下它是如何工作的。
我将创建一个简单的函数,从year-month-day格式的字符串输入中查找“上个月的第一天”。
这是第一个版本的功能:
我将加载这个函数,并尝试几次。一切看起来不错!然而,您可能已经看到了问题。如果我运行这个:
您可以看到该函数在一月份不工作。
我需要重新执行函数并再次进行测试。但是我将使用testthat来代替手动运行所有这些测试。
这是一个testthat测试的格式。该test_underscore_that函数有两个参数。第一个参数是所述测试的说明。如果你在一个复杂的[R包跑了很多不同的测试是非常重要的。它跟一个逗号,因为它是第一个在功能,2个参数。
第二个参数是代码做什么和它应该做什么之间的实际比较。除了expect_equal之外,还有很多不同的测试选项。加载testthat包时,有expect_true、expect_length、expect_less_than…类型的expect下划线,您将看到很多选项。甚至还有一种方法来编写您自己的、自定义的expect条件。
对于这个例子,我只需要期望等于。
因此,让我们为first_of_last_month函数编写一个测试,看看会发生什么。
你看这里,我在检查六月和十二月的日期。我预计6月5日的结果是5月1日,12月1日是11月1日。
我将运行。
似乎什么也没有发生。这就是你在考试中想要的:安静。它真正做的是返回一个值TRUE。
现在让我们将一月份添加到测试中。
可以看到第二个参数的第一行测试了first_of_last_month(2018年1月7日)将等于2017年12月1日的期望。我们将运行测试
你可以看到测试失败了:1月7日的上个月第一天并不等于12月1日。这说明了问题所在。
顺便说一句,这是最不喜欢编码R.通常在R,如果有错误,代码停止运行。test_that仍然会运行所有的测试,一个失败,即使经过。我会添加其他月份的测试,所以你可以看到:
现在我将尝试一种复杂的函数版本,只使用基本R,避免任何包依赖,并运行我的测试:
顺便说一下,使用lubridate包有一种更简单的方法来完成这个函数,但同时,让我检查一下这个版本。我将获取测试文件的源代码
所有的安静。最后,这是一个使用lubridate的版本。
我将加载该版本的函数并运行测试。
哦,有个问题。我的结果是一个日期,目标值应该是一个字符串。所以它们是不相等的。我加上a。字符到结果,然后重试。
它。
而这一切,对于这个情节,对于观看的感谢!对于以上R提示,头向多与R视频网页在bit.ly/morewithR。这是HTTPS B I牛逼周期LŸ有R削减更多,全部小写除了R.那么长!
从IDG.tv精选视频