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

时间:2017-06-13 16:38:59

标签: r rvest testthat

非常感谢社区就如何最好地处理加重情况提出建议。

我有一个R package可以掠夺国家飓风中心的档案并返回整洁的风暴数据。该网站通常不回应。

这方面的一个例子是this Appveyor failure,然后是subsequent pass(同一个分支,同一个提交)。

现在连续四次测试失败了:

构建1.0.141和1.0.143通过了前119次测试。 Build 1.0.142通过了前142个测试。构建1.0.144仅在66次测试后失败。错误是一致的:

  

curl :: curl_fetch_memory(url,handle = handle)出错:

Timeout was reached
     

通话:test_check ... request_fetch - > request_fetch.write_memory - > - > .CALL

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

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

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

你会如何处理这些问题?

1 个答案:

答案 0 :(得分:0)

如果您在超时时偶尔跳过测试就可以了,那么如果响应表明存在超时,我会像hereskip the test一样捕获超时。就像是:

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/")

这种方法可以阻止构建中断。