Hooks Cucumber
Pra você ligado no Medium, hoje vamos aprender a usar o famoso hooks, e de cara vamos criar um hooks para tirar screenshot dos nossos cenários de testes, seja ele de sucesso ou de falha, pois o importante é ter todas evidências registrada e documentada, seja ela para comprovar o teste ou para reportar algum problema.
Mas antes de tudo, o que é hooks ?
Hooks nada mais é do que um “gatilho” que vai ser executado antes ou depois de cada cenário. E para configurar esses hooks, basta utilizar duas palavras chaves que são elas “Before”, “After” e ainda existem os “AfterSteps” e “BeforeSteps” que não estão na documentação do cucumber se não me engano.
Before
O Before é executado antes de cada cenário de teste.
After
O After é executado no final de cada cenário de teste.
BeforerSteps
O BeforeSteps é executado antes de cada passo do cenário de teste.
AfterSteps
O AfterSteps é executado após cada passo do cenário de teste.
Pra que serve os hooks ?
Existem testes que necessitam de configurações, onde são atribuídos trechos de código que podem ser executado antes ou depois de iniciar a execução de um cenário. Outro ponto importante de falar, é que os hooks não serve para fazer seus testes, apenas para realizar configurações, lembre-se disso.
Como já dizia a canção, Quem ficar, ficou…Quem foi, vai, vai, vai…
Então vamos lá…

Para facilitar a vida de todos, deixei pronto um projeto base de realizar pesquisa no google no github através do link: https://github.com/pedrohjmartins/base.
Com o projeto em mãos… “bora” codar.
Antes de criarmos a configuração de tirar print depois de todos os cenários, primeiro precisamos criar a função de tirar screenshot.
Dentro da pasta support do nosso projeto, vamos criar um novo arquivo chamado helper.rb e inserir o seguinte código:
class Helper def take_screenshot(name_file, folder = 'screenshots/test_screens') file = "#{folder}/#{name_file}.png" FileUtils.mkdir_p(folder) unless File.exist?(folder) Capybara.page.driver.browser.save_screenshot(file) endend
Nada mais é do que uma função que vai criar uma pasta e tirar os screenshots.
Com nossa função criada, podemos configurar nosso hooks.
Vamos criar outro arquivo dentro da pasta support, esse com o nome de hooks.rb e implementar o seguinte código:
require_relative 'helper.rb' After do |scenario| @helper = Helper.new @nome = scenario.name.gsub(/([_@#!%()\-=;><,{}\~\[\]\.\/\?\"\*\^\$\+\-]+)/, '') @helper.take_screenshot(@nome, 'screenshots/test_failed') if scenario.failed? unless @helper.take_screenshot(@nome, 'screenshots/test_passed') endend
Onde informamos que é necessário o uso do arquivo helper.rb através do require_relative, pois é la que está nossa função.
Criamos um hooks After, ou seja, que vai ser executado depois de algum teste, e passamos a condição em que esse hooks vai ser executado, que no caso é o scenario, ou seja, vai ser executada no final de cada cenário de teste. Mas poderiamos configurar para ser executado apenas em cenários que possui a tag @necessitadeprint, basta alterar a condição e ficaria da seguinte maneira: After do |@necessitadeprint|, simples assim.
Após isso informamos que os prints vão receber o nome dos cenários através da sintaxe: @nome = scenario.name e configuramos uma condição, onde verifica se o cenário passou ou falhou apenas para salvar os prints em pastas diferentes, no caso de test_passed se passou ou test_falied se falhou.
Após ter feito isso, podemos rodar nosso projeto através do comando “cucumber” e ao finalizar o teste, basta reparar que foi criado uma pasta “screenshots” e dentro dela a pasta test_passed com o print da execução do cenário de teste.

Nesse exemplo foi configurado apenas o hooks after, para testar seus conhecimentos, tente implementar os outros três tipos existentes.
E por hoje é só…
Vou deixar o projeto final também no github através do link:
Tchau, brigadu e até o próximo artigo!
