Se escrever testes já virou um hábito em sua rotina e seus projetos com Ruby on Rails possuem cada vez mais cenários de teste, talvez seja um bom momento para passar a acompanhar a cobertura deles.
Cobertura de testes é uma métrica importante para a qualidade de seu código. A cobertura representa o percentual do código de sua aplicação que é executado ao menos uma vez durante a execução dos testes. Mas, mais importante que o percentual é a possibilidade de identificar os trechos de código que ainda não foram abordados em testes.
Sabemos que mesmo um código com 100% de cobertura não é isento de possíveis bugs. Às vezes cometemos erros ao interpretar regras de negócio e criamos testes com expectativas erradas ou podemos ter bugs nos testes que produzem falsos positivos, por exemplo. Mesmo assim, ter uma cobertura alta com certeza vai aumentar a confiança no seu código, especialmente quando for necessário fazer mudanças em trechos antigos e, através dos testes, você conseguir rastrear rapidamente todo o código impactado com as mudanças.
Em projetos Ruby (com ou sem Rails), a gem simplecov
é a mais bem classificada da categoria no RubyToolbox: https://www.ruby-toolbox.com/categories/code_coverage. Uma das vantagens desta gem é a simplicidade de sua configuração. Neste tutorial vamos configurar o SimpleCov em um projeto Rails.
Para começar, adicione a gem em seu Gemfile
dentro do grupo de gems do ambiente de teste, usando a opção require: false
.
group :test do
gem 'simplecov', require: false
end
Execute o bundle install
em seguida.
A opção require
indica que a gem não será carregada automaticamente. Caberá a você indicar em que momento ela deve ser incorporada à execução do código. No caso do simplecov
, a gem deve ser carregada e executada antes do início da execução dos testes em si. Neste tutorial vamos considerar um projeto que utiliza a gem rspec-rails
para escrita de testes. Esta gem
, que é uma especialização do rspec
, cria dois arquivos em que podemos fazer pequenas configurações da execução dos testes: spec/spec_helper.rb
e spec/rails_helper.rb
Logo no início do arquivo spec/rails_helper.rb
você deve adicionar o código indicado pelo SimpleCov:
require 'simplecov'
SimpleCov.start
É muito importante adicionar estas linhas no início do arquivo, somente assim o SimpleCov será inicializado no momento correto e não irá ignorar arquivos importantes nem monitorar arquivos de configuração que não são objetivo dos nossos testes. Caso você use outra ferramenta de testes diferente do RSpec, vale a pena conferir a documentação oficial para entender como configurar corretamente o SimpleCov em seu projeto: https://rubydoc.info/gems/simplecov/frames#use-it-with-any-framework
Com esta configuração você já tem a gem funcionado. Caso execute os testes com rake test
ou rspec
, você deverá ver a porcentagem de cobertura ao fim do comando.
Finished in 1.97 seconds (files took 2.89 seconds to load)
80 examples, 0 failures
Coverage report generated for RSpec to /Users/campuscode/workspace/meu-projeto/coverage. 1550 / 1551 LOC (99.94%) covered.
No exemplo acima, a cobertura está em 99,94%, mas ainda precisamos fazer ajustes. A gem SimpleCov foi criada para projetos em Ruby puro, mas existe uma configuração especial para projetos Rails. Em seu rails_helper.rb
modifique as linhas adicionadas para o seguinte:
require 'simplecov'
SimpleCov.start 'rails'
Execute novamente os testes e o resultado será diferente. Em nosso exemplo, o novo resultado da cobertura foi de 88%. A quantidade de linhas de código avaliadas (LOC) também caiu substancialmente, de 1551 para 304.
Finished in 2.19 seconds (files took 2.57 seconds to load)
80 examples, 0 failures
Coverage report generated for RSpec to /Users/campuscode/workspace/meu-projeto/coverage. 268 / 304 LOC (88.16%) covered.
Isto acontece pois agora o SimpleCov sabe que nosso projeto é uma aplicação Rails e, com isso, passou a avaliar com mais precisão todo o código da pasta app
, inclusive trechos de código 'vazios' como helpers
e mailers
que você pode não ter utilizado até então.
Para cada execução dos testes um novo relatório será gerado. O relatório tem formato HTML e será armazenado sempre na pasta coverage
, criada pelo SimpleCov na raíz do seu projeto.
Trecho de relatório do SimpleCov.
Este relatório é muito volátil: a cada execução, um novo HTML será produzido com vários arquivos temporários armazenados em seu projeto. Por isto é altamente recomendado adicionar o diretório coverage
ao .gitignore
do projeto.
Por último, caso você não utilize algum recurso do Rails, como Action Cable
ou 'Mailers', você pode indicar ao SimpleCov para que estes arquivos sejam ignorados. Para isto vamos converter o método start
em um bloco e dentro deste bloco utilizar o método add_filter
indicando o nome das pastas que devem ser filtradas (ignoradas) pelo SimpleCov:
require 'simplecov'
SimpleCov.start 'rails' do
add_filter 'channels'
add_filter 'mailers'
end
Pronto! Agora seu projeto já está preparado para monitorar a cobertura dos testes a cada execução.
Um último ponto bastante importante: o SimpleCov sempre vai avaliar a cobertura considerando os testes recém-executados em comparação com todo o código do projeto. Então, caso você execute os testes somente de um diretório, por exemplo: rspec spec/models
, a cobertura deverá cair drasticamente, pois para o SimpleCov não vão existir testes contemplando controllers
, helpers
etc. Então, de forma simples, considere somente o resultado da cobertura ao executar todos os testes de seu projeto.
Espero que o SimpleCov ajude você a monitorar e evoluir a cobertura de testes e, de certa forma, a qualidade dos seus projetos. Aqui na Campus Code, temos por hábito usar o SimpleCov com este propósito e a ferramenta sempre foi super eficiente.