Eustáquio Rangel

Desenvolvedor, pai, metalhead, ciclista

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.




Comentários

Comentários fechados.

Sem nenhum comentário.

Artigos anteriores