Minitest before_all
Publicado em Developer
Estava precisando carregar uma planilha imensa para ser importada (utilizando a gem Spreadsheet) e me deparei com uma demora incômoda, pois no Minitest não existe um método before_all
como no Rspec, então resolvi dar uma investigada. O Minitest
tem um método chamado before_setup para ser utilizado com extensões, mas existem algumas situações com variáveis de instância de classes que eu preferi evitar.
Primeiro, vamos ver o código original:
Rodando os testes:
$ ruby spreadsheet_test.rb
Run options: --seed 33972
# Running:
document object id: 19838920
document object id: 22053520
document object id: 22957440
Finished in 1.455343s, 2.0614 runs/s, 2.0614 assertions/s.
3 runs, 3 assertions, 0 failures, 0 errors, 0 skips
Podemos ver que sempre são criados objetos diferentes em @doc
, apesar de utilizar o operador ||=
, ou seja, estamos fazendo um parse da planilha (que é bem grande) a cada vez que passamos por ali, criando um objeto novo. Se alterarmos para o before
utilizar um método de classe, que vai manter o estado com a varíavel de instância da classe, enviando como retorno, vai ficar interessante:
e rodarmos os testes novamente:
$ ruby spreadsheet_test.rb
Run options: --seed 57440
# Running:
document object id: 20499820
document object id: 20499820
document object id: 20499820
Finished in 1.228259s, 2.4425 runs/s, 2.4425 assertions/s.
3 runs, 3 assertions, 0 failures, 0 errors, 0 skips
Vamos ver que agora é sempre o mesmo objeto, o que nos economizou algum tempo rodando os testes e vai nos economizar mais ainda quando mais testes forem adicionados. Com os testes que até agora tenho no sistema real já ouve uma redução do tempo dos testes para 1/4 do tempo, o que é bem expressivo.
Tags:
Comentários
Comentários fechados.
Sem nenhum comentário.