r - 抓取波动网站时处理不一致的测试结果



希望社区就如何最好地处理恶化情况提供建议。

我有一个 R 包,可以抓取国家飓风中心存档并返回整洁的风暴数据。该网站通常没有响应。

这方面的一个例子是这个Appveyor失败,然后是后续的传递(相同的分支,相同的提交)。

目前,它已连续四次测试失败:

  • 版本 1.0.141
  • 版本 1.0.142
  • 版本 1.0.143
  • 版本 1.0.144

内部版本 1.0.141和 1.0.143 通过前 119 次测试。内部版本 1.0.142 通过了前 142 次测试。内部版本 1.0.144 仅在 66 次测试后失败。错误是一致的:

curl::curl_fetch_memory(url, 句柄 = 句柄)中的错误:

Timeout was reached

呼叫: test_check ...request_fetch -> request_fetch.write_memory ->-> .叫

我有很多测试,因为刮掉的几个产品存在细微的差异或拼写错误。因此,当我修改正则表达式模式以适应这些差异时,我想确保我不会无意中破坏其他内容。

我添加了多次尝试、请求之间的延迟和超时选项的选项。不幸的是,他们似乎没有多大帮助,如果有的话。

我向社区提出的问题是:您能否提供意见或建议作为处理这种情况的更好方法?我知道将测试与生产环境隔离是不好的形式。但我不需要对整个软件包进行所有这些测试。

你会如何处理这些问题?

如果你同意在超时时偶尔跳过测试,那么我会像他们在这里所做的那样捕获超时,如果响应表明有超时,则跳过测试。像这样:

safe_GET <- purrr::safely(httr::GET)
skip_if_cant_get <- function(url) {
resp <- safe_GET(url)
if (is.null(resp$result)) {
testthat::skip(paste0("Couldn't get ", url, " for testing"))
}
resp
}
resp <- skip_if_cant_get("http://www.nhc.noaa.gov/archive/1998/1998archive.shtml")
httr::http_status(resp$result)
#> $category
#> [1] "Success"
#> 
#> $reason
#> [1] "OK"
#> 
#> $message
#> [1] "Success: (200) OK"
# The timeout on this one will trigger the skip()
# resp <- skip_if_cant_get("http://deadbeefdeadbeef.org/")

此方法将阻止生成中断。

最新更新