microdadosBrasil
microdadosBrasil copied to clipboard
unit tests for downloads
@gutorc92 , @daniellima123 ,
conforme conversamos ontem, tentem criar testes unitários para as funções de download. Basicamente para todas as bases de dados de todos os anos a função iria testar se o link de download existe, se o arquivo está disponível para download.
Os endereços para download e nome dos arquivos a serem baixados estão nos arquivos do tipo *_metadata_harmonization.csv
que estão na pasta ins/extdata
.
Tentem não incluir novos pacotes e dependências se possível.
Eu imagino uma função do tipo: test_download_sorce_data()
, que seria similar à download_sorce_data()
, exceto que os dados não seriam de fato baixados. Ou se não apenas adicionar um parametro test=FALSE
para download_sorce_data()
. Se for mudado para TRUE
aí seria feito apena o teste. Se for test=FALSE
ele tenta baixar o dado (como está atualmente)
E uma outra função para iterar testes para todas as bases de dados do pacote. Para não hard code o nome das bases de dados na função (o que criaria mais um ponto de desatualização do pacote) eu sugiro
que esta função pegue todos os arquivos do *_metadata_harmonization.csv
e para cada um deles vá tentando fazer download linha por linha.
Olá @lucasmation , tudo bem? Eu escrevi testes unitários para os links de download, seguindo o estilo:
test_that("Urls for CAGED are working", {
path <- file.path(folder, "CAGED_files_metadata_harmonization.csv")
r <- read.csv2(path, stringsAsFactors = FALSE)
expect_working_link <- function(link) {
eval(bquote(expect_equal(url.exists(link), TRUE)))
}
expect_working_link(r$download_path[r$period=="2007-01m"])
expect_working_link(r$download_path[r$period=="2007-02m"])
expect_working_link(r$download_path[r$period=="2007-03m"])
etc...
Para todos os bancos de dados. Não é o código mais elegante possível, mas ele funciona. Optei por essa síntaxe mais "força bruta" porque assim dá pra identificar rapidamente quais links estão quebrados, se comparado com um grande teste para ver se algum link num banco de dados estava quebrado. Não sei se há uma implementação mais elegante, mas foi o que consegui.
O output de devtools::test()
> devtools::test()
i Loading microdadosBrasil
i Testing microdadosBrasil
√ | OK F W S | Context
x | 134 10 | Downloading source data [110.3 s]
----------------------------------------------------------------------------------------
Failure (test_download_source_data.R:186:3): Urls for Censo Educação Superior are working
url.exists(link) not equal to TRUE.
names for target but not for current
Lengths (2, 1) differ (comparison on first 1 components)
Backtrace:
1. microdadosBrasil:::expect_working_link(...) test_download_source_data.R:186:2
4. testthat::expect_equal(url.exists(link), TRUE)
Coloquei tudo num arquivo em tests/test_download_source_data
.
Você gostaria que eu abrisse um pull request? Acho que ele resolve bem esse issue aqui.
O código está aqui.