RSpec - Filtragem
Você pode querer ler a seção sobre Metadados RSpec antes de ler esta seção porque, ao que parece, a filtragem RSpec é baseada em Metadados RSpec.
Imagine que você tem um arquivo de especificações e ele contém dois tipos de testes (exemplos): testes funcionais positivos e testes negativos (erros). Vamos defini-los assim -
RSpec.describe "An Example Group with positive and negative Examples" do
context 'when testing Ruby\'s build-in math library' do
it 'can do normal numeric operations' do
expect(1 + 1).to eq(2)
end
it 'generates an error when expected' do
expect{1/0}.to raise_error(ZeroDivisionError)
end
end
end
Agora, salve o texto acima como um arquivo chamado 'filter_spec.rb' e execute-o com este comando -
rspec filter_spec.rb
Você verá uma saída parecida com isto -
..
Finished in 0.003 seconds (files took 0.11201 seconds to load)
2 examples, 0 failures
Agora, e se quiséssemos executar novamente apenas os testes positivos neste arquivo? Ou apenas os testes negativos? Podemos fazer isso facilmente com filtros RSpec. Altere o código acima para este -
RSpec.describe "An Example Group with positive and negative Examples" do
context 'when testing Ruby\'s build-in math library' do
it 'can do normal numeric operations', positive: true do
expect(1 + 1).to eq(2)
end
it 'generates an error when expected', negative: true do
expect{1/0}.to raise_error(ZeroDivisionError)
end
end
end
Salve suas alterações em filter_spec.rb e execute este comando ligeiramente diferente -
rspec --tag positive filter_spec.rb
Agora, você verá uma saída semelhante a esta -
Run options: include {:positive=>true}
.
Finished in 0.001 seconds (files took 0.11401 seconds to load)
1 example, 0 failures
Ao especificar --tag positivo, estamos dizendo ao RSpec para executar exemplos apenas com a variável de metadados: positivo definida. Poderíamos fazer a mesma coisa com testes negativos executando o comando como este -
rspec --tag negative filter_spec.rb
Lembre-se de que esses são apenas exemplos, você pode especificar um filtro com qualquer nome que desejar.
Formatadores RSpec
Os formatadores permitem que o RSpec exiba a saída dos testes de maneiras diferentes. Vamos criar um novo arquivo RSpec contendo este código -
RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do
context 'when running some tests' do
it 'the test usually calls the expect() method at least once' do
expect(1 + 1).to eq(2)
end
end
end
Agora, salve em um arquivo chamado formatter_spec.rb e execute este comando RSpec -
rspec formatter_spec.rb
Você deve ver uma saída parecida com esta -
.
Finished in 0.002 seconds (files took 0.11401 seconds to load)
1 example, 0 failures
Agora execute o mesmo comando, mas desta vez especifique um formatador, como este -
rspec --format progress formatter_spec.rb
Você deve ver a mesma saída desta vez -
.
Finished in 0.002 seconds (files took 0.11401 seconds to load)
1 example, 0 failures
O motivo é que o formatador de “progresso” é o formatador padrão. Vamos tentar um formatador diferente a seguir, tente executar este comando -
rspec --format doc formatter_spec.rb
Agora você deve ver esta saída -
A spec file to demonstrate how RSpec Formatters work
when running some tests
the test usually calls the expect() method at least once
Finished in 0.002 seconds (files took 0.11401 seconds to load)
1 example, 0 failures
Como você pode ver, a saída é bem diferente com o formatador “doc”. Este formatador apresenta a saída em um estilo semelhante a documentação. Você deve estar se perguntando como são essas opções quando ocorre uma falha em um teste (exemplo). Vamos mudar o código emformatter_spec.rb parecer assim -
RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do
context 'when running some tests' do
it 'the test usually calls the expect() method at least once' do
expect(1 + 1).to eq(1)
end
end
end
A expectativa expect(1 + 1).to eq(1)deve falhar. Salve suas alterações e execute novamente os comandos acima -
rspec --format progress formatter_spec.rb e lembre-se, como o formatador de “progresso” é o padrão, você pode simplesmente executar: rspec formatter_spec.rb. Você deve ver esta saída -
F
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some tests
the test usually calls the expect() method at least once
Failure/Error: expect(1 + 1).to eq(1)
expected: 1
got: 2
(compared using ==)
# ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'
Finished in 0.016 seconds (files took 0.11201 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./formatter_spec.rb:3 # A spec file to demonstrate how RSpec
Formatters work when running some tests the test usually calls
the expect() method at least once
Agora, vamos tentar o formatador doc, execute este comando -
rspec --format doc formatter_spec.rb
Agora, com o teste com falha, você deve ver esta saída -
A spec file to demonstrate how RSpec Formatters work
when running some tests
the test usually calls the expect() method at least once (FAILED - 1)
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some
tests the test usually calls the expect() method at least once
Failure/Error: expect(1 + 1).to eq(1)
expected: 1
got: 2
(compared using ==)
# ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'
Finished in 0.015 seconds (files took 0.11401 seconds to load)
1 example, 1 failure
Exemplos de falha
rspec ./formatter_spec.rb:3 # Um arquivo de especificação para demonstrar como os formatadores RSpec funcionam ao executar alguns testes, o teste geralmente chama o método expect () pelo menos uma vez.
Os formatadores RSpec oferecem a capacidade de alterar a forma como os resultados do teste são exibidos, é até possível criar seu próprio formatador personalizado, mas esse é um tópico mais avançado.