├── .gitignore ├── Automatizando_Seus_Testes_com_Capybara.md ├── Configuracoes.md ├── Criando_Steps_Definitions.md ├── Executando_seus_arquivos_Feature.md ├── LICENSE ├── README.md └── cucumber ├── Gemfile ├── Gemfile.lock └── features ├── specifications └── register.feature ├── step_definitions └── register.rb └── support └── env.rb /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | *.rbc 3 | /.config 4 | /coverage/ 5 | /InstalledFiles 6 | /pkg/ 7 | /spec/reports/ 8 | /spec/examples.txt 9 | /test/tmp/ 10 | /test/version_tmp/ 11 | /tmp/ 12 | *.lock 13 | 14 | # Used by dotenv library to load environment variables. 15 | # .env 16 | 17 | ## Specific to RubyMotion: 18 | .dat* 19 | .repl_history 20 | build/ 21 | *.bridgesupport 22 | build-iPhoneOS/ 23 | build-iPhoneSimulator/ 24 | 25 | ## Specific to RubyMotion (use of CocoaPods): 26 | # 27 | # We recommend against adding the Pods directory to your .gitignore. However 28 | # you should judge for yourself, the pros and cons are mentioned at: 29 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 30 | # 31 | # vendor/Pods/ 32 | 33 | ## Documentation cache and generated files: 34 | /.yardoc/ 35 | /_yardoc/ 36 | /doc/ 37 | /rdoc/ 38 | 39 | ## Environment normalization: 40 | /.bundle/ 41 | /vendor/bundle 42 | /lib/bundler/man/ 43 | 44 | # for a library or gem, you might want to ignore these files since the code is 45 | # intended to run in multiple environments; otherwise, check them in: 46 | # Gemfile.lock 47 | # .ruby-version 48 | # .ruby-gemset 49 | 50 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 51 | .rvmrc 52 | -------------------------------------------------------------------------------- /Automatizando_Seus_Testes_com_Capybara.md: -------------------------------------------------------------------------------- 1 | # Capybara para Todos. 2 | 3 | Automatizando seus testes com capybara. Parte I. 4 | 5 | Bom dia pessoal, vou começar a escrever sobre testes automatizados já colocando o "projeto" disponível para aplicação dos testes no dia a dia de cada um. Como eu não muita paciência para ficar mantendo um blog, o github será o canal principal de minhas postagens. 6 | 7 | Bom, eu vou descorrer o assunto de uma forma bem simples. 8 | 9 | Antes de mais nada vamos a configuração do ambiente: 10 | 11 | **Windows:** 12 | 13 | Necessário: [rubyinstaller](http://rubyinstaller.org/downloads/). 14 | 15 | Obs.: Quando se instala o ruby, será necessário a instalação do DevKit correspondente da versão que você instalou. 16 | 17 | **Mac:** 18 | 19 | Necessário: Baixar o Xcode pelo [link:](https://developer.apple.com/xcode/downloads/). Aprendi que sempre que instalar o SO, a primeira coisa será instalar o Xcode. 20 | 21 | Bem, depois do Xcode, vamos baixar o Homebrew via terminal com o comando: 22 | 23 | ```ruby 24 | ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” . 25 | ``` 26 | 27 | Para explicar o que é o homebrew basta dizer: “O Homebrew instala as coisas que você precisa que a Apple não forneceu para você.” - [fonte:](http://brew.sh/index_pt-br.html). Ou seja, é um gerenciador de pacotes. 28 | 29 | Reinicie a máquina (isso mesmo, para “completar as instalações”). 30 | 31 | Com o Homebrew instalado, será necessário instalar o “Qt” - Framework multiplataforma para desenvolvimento de interfaces gráficas - [fonte:](http://pt.wikipedia.org/wiki/Qt) e serve basicamente para podermos utilizar o selenium como driver padrão de execução para os testes. Para instalar o Qt, é bem simples: 32 | 33 | ```ruby 34 | brew install qt 35 | ``` 36 | 37 | Instalar o gerenciador de versões RVM (eu gosto), mas tem também o rbenv. Para instalar o rvm: 38 | 39 | ```ruby 40 | 1. gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 41 | 2. curl -sSL https://get.rvm.io | bash -s stable 42 | 3. Reiniciar o terminal 43 | Caso o "curl" não estiver instalado, basta "brew install curl". 44 | ``` 45 | 46 | **Ubuntu:** 47 | 48 | Instalar o gerenciador de versões RVM (eu gosto), mas tem também o rbenv. Para instalar o rvm: 49 | 50 | ```ruby 51 | 1. gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 52 | 2. curl -sSL https://get.rvm.io | bash -s stable 53 | 3. Reiniciar o terminal 54 | Caso o "curl" não estiver instalado, basta "brew install curl". 55 | ``` 56 | 57 | 58 | Para instalar alguma versão do ruby específica, primeiro de uma olhada nas [releases](https://www.ruby-lang.org/en/downloads/releases/) e depois através do rvm, faça: 59 | 60 | ```ruby 61 | rvm install + versão 62 | 63 | Exemplo 64 | 65 | rvm install 2.4.3 66 | ``` 67 | 68 | Eu migrei os testes da versão 2.3 para 2.4 recentemente e não estou tendo problemas, pelo contrário, to gostando do fator performance e estabilidade. 69 | 70 | Agora que temos a base para trabalhar, vamos então a parte das [configurações](https://github.com/thiagomarquessp/capybaraforall/blob/master/Configuracoes.md), pois devemos montar nosso ambiente para trabalhar. 71 | -------------------------------------------------------------------------------- /Configuracoes.md: -------------------------------------------------------------------------------- 1 | # Algo chamado Geckodriver 2 | 3 | Até a versão 3.0 do Selenium e versão 46 do Firefox é necessário utilizarmos o Geckodriver para que o browser venha a ser aberto, então temos que instalar antes de iniciar algum projeto da seguinte maneira: 4 | 5 | ```ruby 6 | curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - 7 | sudo apt-get install jq nodejs curl -qy 8 | sudo npm install -g geckodriver 9 | ``` 10 | 11 | Para instalar o node no Mac é bem mais fácil: 12 | 13 | ```ruby 14 | brew install node 15 | ``` 16 | 17 | Só para explicar, eu instalei o Node e através do Node eu instalei o geckodriver com -g para ele instalar de forma global e isso quer dizer que ele vai colocar o geckodriver exatamente onde ele deve estar. 18 | 19 | Obs.: Usuários de Windows, o processo é parecido, instale o Node e no terminal ou no Cmder instale com os mesmos comandos npm Ok. 20 | 21 | # Configuração do ambiente para automação. 22 | 23 | Dado que estamos com **ruby** e o **geckodriver** instalado será necessário configurarmos o nosso ambiente de trabalho. 24 | 25 | As bibliotecas no ruby são chamadas de **gems** e tudo que vamos precisar alguém pensou primeiro e criou uma gem e a comunidade da manutenção. 26 | 27 | Pra começar um projeto, vamos precisar instalar uma gem chamada **bundler**, que servirá como gerenciador das gems e suas dependências através do nosso arquivo Gemfile (falarei mais abaixo). 28 | 29 | Para instalar, basta rodar o seguinte comando: 30 | 31 | ```ruby 32 | gem install bundler 33 | ``` 34 | 35 | Toda gem que eu precisar, antes de sair instalando de alegre, de uma olhada em no rubygems, que é o lugar onde as bibliotecas ficam disponíveis e isso é importante pra decidirmos qual versão vamos trabalhar. Quando procurarmos a gem que estamos querendo trabalhar, vai aparecer as versões, a forma de como ela deve ficar no Gemfile ou então a forma manual de instalação. Com isso devemos copiar e colar para que eu tenha o controle total das versões que estou trabalhando. Nós temos uma péssima mania de qualquer versão nova que sai, já saímos atualizando sem saber porque estamos instalando. 36 | 37 | Dentro da raiz do seu projeto, crie um arquivo chamado Gemfile (exatamente desse jeito, sem extensão). A grosso modo, o Gemfile é um arquivo onde eu armazeno a coleção de gems que eu vou precisar para o meu projeto. Com ele não sou obrigado a instalar gem a gem na mão. [Aqui](https://tosbourn.com/what-is-the-gemfile/) tem uma boa explicação do que é e como deixá-lo mais eficaz e escalável, mas por hora vamos cria da seguinte maneira: 38 | 39 | ```ruby 40 | source 'https://rubygems.org' 41 | 42 | gem 'cucumber', '~> 3.1' 43 | gem 'capybara', '~> 2.16', '>= 2.16.1' 44 | gem 'selenium-webdriver', '~> 3.8' 45 | ``` 46 | Dessa maneira eu to deixando claro quais as versões que eu to trabalhando. O cucumber sofreu muitas mudanças da versão 2.4 pra versão 3 em diante. O objetivo desse refactory é justamente adaptar a essas novas mudanças. 47 | 48 | Essas são as gems necessárias para um início de trabalho. 49 | 50 | Cucumber será a base da nossa automação, utilizando Gherkin para escrita. 51 | 52 | Capybara será o framework de desenvolvimento. 53 | 54 | Selenium Webdriver será o Driver base e abrir o Firefox para automação. 55 | 56 | Quando temos o Gemfile, podemos usar o bundler para instalar todas as gems e suas dependências, usando o seguinte comando: 57 | 58 | ```ruby 59 | bundle install 60 | ``` 61 | Com as gems já instaladas, agora sim vamos começar a trabalhar. 62 | 63 | Na mesma pasta onde foi criado o arquivo Gemfile, vamos iniciar o nosso projeto com o seguinte comando: 64 | 65 | ```ruby 66 | cucumber --init 67 | ``` 68 | 69 | Após o comando cucumber --init será criada a estrutura básica para início do desenvolvimento: 70 | 71 | ```ruby 72 | create features 73 | create features/step_definitions 74 | create features/support 75 | create features/support/env.rb 76 | ``` 77 | Eu gosto de trabalhar com duas pastas a mais, que seria cucumber e a pasta specifications e ficaria da seguinte maneira: 78 | 79 | ```ruby 80 | cucumber 81 | cucumber/features 82 | cucumber/features/specifications 83 | cucumber/features/step_definitions 84 | cucumber/features/support 85 | cucumber/features/support/env.rb 86 | ``` 87 | Eu gosto da pasta specifications para colocar dentro dela todas as minhas features. Mas pode-se criar quantas pastas você julgue necessário. É até recomendado se seu sistema for muito complexo, por exemplo, um e-commerce que tem Cadastro, Pagamento, Notificação, etc. E com isso você teria uma pasta dentro de specifications para cada frente, até mesmo para ter controle na hora de dar alguma manutenção. 88 | 89 | Então vamos lá: 90 | 91 | ```ruby 92 | specifications serve para colocar os arquivos .features; 93 | step_definitions serve para colocar os arquivos de steps .rb; 94 | support serve para colocarmos qualquer tipo de configuração para os nossos testes também .rb (assim como o arquivo env.rb, que possui configurações iniciais, gems a serem utilizadas para os testes, etc.). 95 | ``` 96 | Se vocês repararem quando o comando init é dado, um arquivo chamado env.rb é criado na pasta support e esse arquivo nada mais é que um arquivo de configuração para os testes, e nele deve conter TODAS as gems que você quer utilizar, antecedidos de um require e também alguma configuração específica para que TODA vez que eu rodar o comando cucumber, ele olhe nesse arquivo, verifica as gems e as configurações para poder seguir com o teste. Segue o exemplo que vamos utilizar: 97 | 98 | ```ruby 99 | require 'capybara/cucumber' 100 | require 'selenium-webdriver' 101 | 102 | Capybara.register_driver :selenium do |app| 103 | Capybara::Selenium::Driver.new(app, :browser => :firefox) 104 | end 105 | 106 | Capybara.default_driver = :selenium 107 | Capybara.default_max_wait_time = 60 108 | 109 | Capybara.app_host = "https://www.flube.com.br/" 110 | ``` 111 | Onde, **require "gem a ser utilizada"** eu estou falando que para rodar esse projeto, eu estou utilizando essa gem. 112 | 113 | **Capybara.register_driver** eu to informando que SIM, ele pode abrir o Firefox com o geckodriver :), porém, posso também passar o parâmetro :chrome mas isso não vai ser discutido aqui beleza. 114 | 115 | **Capybara.default_driver = :selenium** (Defino o Driver que eu vou utilizar, no caso, Selenium Webdriver. 116 | 117 | **Capybara.default_max_wait_time = 60** (Time out definido nesse caso, em 60 segundos, mas o valor você que estabelece). 118 | 119 | **Capybara.app_host** eu coloco a url do produto que estou a trabalhar. 120 | 121 | Dica: Pra ficar coerente, no arquivo env.rb coloque os require nas gems que tu informa no Gemfile, para não ter que colocar coisas a mais ou a menos. 122 | 123 | Agora que temos o ambiente montado, devemos enteder algumas coisas. A primeira dela é como trabalhar com [arquivos de feature.](https://github.com/thiagomarquessp/capybaraforall/blob/master/Executando_seus_arquivos_Feature.md) 124 | -------------------------------------------------------------------------------- /Criando_Steps_Definitions.md: -------------------------------------------------------------------------------- 1 | # Criando seu primeiro arquivo de Steps. 2 | 3 | Agora que criamos nosso arquivo .feature com Gherkin, vamos pegar o resultado obtido para criar nosso arquivo de Steps e vamos dar o nome de register_steps.rb na pasta step_definitions: 4 | 5 | ```ruby 6 | workspace\capybaraforall\cucumber\features\step_definitions\register_steps.rb 7 | ``` 8 | E aquele resultado vamos copiar e colar nesse arquivo e vai ficar assim: 9 | 10 | ```ruby 11 | Given("I click on Sign in") do 12 | pending # Write code here that turns the phrase above into concrete actions 13 | end 14 | 15 | When("I fill in obligatory fields") do 16 | pending # Write code here that turns the phrase above into concrete actions 17 | end 18 | 19 | Then("my registration will be successfully made") do 20 | pending # Write code here that turns the phrase above into concrete actions 21 | end 22 | ``` 23 | 24 | _**Se você reparou, cada Given/When/And/Then + RegEx tem um "do" e um "end" ou seja, Given/When/And/Then da início ao método que vamos desenvolver, "do" te da a prerrogativa (essa eu gastei o português) para início do desenvolvimento (ou colocar os comandos para serem executados) e o "end" finaliza o método. Então podemos concluir que dentro de um arquivo de steps eu tenho um método para cada passo do meu teste. E indo além, quando eu, em qualquer outro arquivo.feature escrever uma mesma frase: "I click on Sign in" eu não vou me preocupar em ter que desenvolver esse step de novo, porque ele já foi criado em algum lugar dentro de um método.**_ 25 | 26 | Bem .. arquivo criado, vamos ao que interessa, que é justamente dar vida ao nosso teste. 27 | 28 | No lugar do "pending" vamos colocar os comandos necessários para execução dos passos do nosso teste. Vou listar aqui os comandos básicos para que possamos trabalhar dentro desse contexto. 29 | 30 | Em outros artigos vou falar de técnicas mais específicas e com outros comandos, mas por hora pense que você está aprendendo e que precisa começar do zero, e se eu te passar um monte de comando, você vai se confundir e não vai entender, e fatalmente vai perder o interesse. 31 | 32 | ```ruby 33 | visit "url do site" - Bom , não precisa falar muito dessa neh =) 34 | 35 | fill_in ‘ID do elemento para inserir valor’, :with => “Aprendendo Capybara” – Irá inserir no elemento a string Aprendendo Capybara. 36 | 37 | find(:id, “id do elemento”).click – Clica em um elemento definido por ID. 38 | find(:css, “css do elemento”).click – Clica em um elemento definido por CSS. 39 | find(:xpath, “xpath do elemento”).click – Clica em um elemento definido por XPATH. 40 | 41 | all(:id, “id do elemento”)[0].click – Clica no primeiro elemento dentro de uma lista definido por ID. 42 | all(:css, “css do elemento”)[0].click – Clica no primeiro elemento dentro de uma lista definido por CSS. 43 | all(:xpath, “xpath do elemento”)[0].click – Clica no primeiro elemento dentro de uma lista definido por XPATH. 44 | 45 | PS: Quando nos depararmos com um checkbox, radiobutton, utilizar da seguinte forma: 46 | 47 | find(:radio_button, ‘nome do radiobutton’).set(true) – Nesse caso, ele vai selecionar aquele radiobutton. 48 | find(:checkbox, ‘nome do checkbox’).set(true) – Nesse caso, ele vai selecionar aquele checkbox. 49 | 50 | select ‘Nome do item no Drop Down’, from: ‘nome do elemento drop down’ – Seleciona um item de um drop down. 51 | ex: select ‘Apto’, from ‘tipo_moradia’ 52 | 53 | click_button ‘Cadastrar’ –Clica no botão cadastrar. 54 | 55 | click_link ‘Home’ – Clica no link Home caso haja algum na página. 56 | 57 | expect(page).to have_content ‘Cadastro efetuado com sucesso’ – Procura a mensagem e caso tenha, será sucesso. 58 | 59 | within_frame 'id do frame' do 60 | comandos de para interagir dentro do frame 61 | end - Entra no Frame para continuar os testes. 62 | 63 | page.has_css?('css do que vc quer validar na tela', :text => 'texto pra ser validado', :visible => true) - Olha o texto que está no elemento e ve se esse texto está visível. 64 | 65 | ``` 66 | 67 | Caso queira se aprofundar mais, olhem o [github](https://github.com/teamcapybara/capybara) do capybara. 68 | 69 | # Forma de buscar um elemento: 70 | 71 | Uma ferramenta de busca de elemento muito boa é o próprio inspecionar do Google Chrome, mas também tem o Firebug no Firefox, em ambos a forma de busca de elemento é a mesma. Eu vou passar aqui a forma via Jquery, mas tem outros seletores que tu podes usar OK. Bem, quando tu quiseres buscar um elemento, pense em saber como uma página html feita e abra essa página, clica com botão direto do mouse e vai em inspecionar elemento. Ele vai marcar o elemento em questão e vai ser algo mais ou menos assim: 72 | 73 | ```ruby 74 | 75 | ``` 76 | No console do navegador, a forma mágica será: # para ID e . para classes (cerquilha para ID e ponto para classes), por exemplo, vou buscar o elemento do exemplo pelo ID: 77 | 78 | ```ruby 79 | $('#topbar-login-link') e aquando eu dou enter: 80 | [a#topbar-login-link.login-link.topbar-buttons.button-link.topbar-login-js, context: document, selector: "#topbar-login-link"] 81 | ``` 82 | Quando vc passar o mouse por cima do resultado, o elemento vai ficar em destaque, que te garante que o elemento  de fato o elemento que você quer trabalhar. 83 | 84 | E se fosse pela classe do elemento: 85 | ```ruby 86 | $('.login-link') e aquando eu dou enter: 87 | [a#topbar-login-link.login-link.topbar-buttons.button-link.topbar-login-js, context: document, selector: "#topbar-login-link"] 88 | ``` 89 | Se o elemento que estiver em destaque for o que você realmente quer trabalhar, tu vai pegar o Id ou a classe e vai colocar nos comandos do capybara, por exemplo: 90 | 91 | ```ruby 92 | Buscando pelo ID 93 | find(:css, '#topbar-login-link').click 94 | 95 | Buscando pela classe 96 | find(:css, '.login-link').click 97 | ``` 98 | Então vamos aplicar: 99 | 100 | Todo teste automatizado é derivado de uma ação manual feita em algum momento em algum lugar, então vamos lá acessar o arquivo register.rb e deixar o nosso código da seguinte maneira: 101 | 102 | ```ruby 103 | Given("I click on Sign in") do 104 | visit '/index.php' 105 | click_link 'Sign in' 106 | end 107 | 108 | When("I fill in obligatory fields") do 109 | fill_in 'email_create', :with => 'learningcucumber01@test.com' 110 | click_button 'Create an account' 111 | find('#uniform-id_gender1').click 112 | fill_in 'customer_firstname', :with => 'Primeiro Nome' 113 | fill_in 'customer_lastname', :with => 'Sobrenome' 114 | fill_in 'passwd', :with => 'inicial1234' 115 | select '30', from: 'days' 116 | select 'January', from: 'months' 117 | select '1986', from: 'years' 118 | fill_in 'firstname', :with => 'Primeiro Nome Endereco' 119 | fill_in 'lastname', :with => 'Sobrenome Endereco' 120 | fill_in 'address1', :with => 'Rua dos Milagres' 121 | fill_in 'city', :with => 'Alabama Cidade' 122 | select 'Alabama', from: 'id_state' 123 | fill_in 'postcode', :with => '35007' 124 | fill_in 'phone_mobile', :with => '866-234-5382' 125 | fill_in 'alias', :with => 'Alias Exemplo' 126 | click_button 'Register' 127 | end 128 | 129 | Then("my registration will be successfully made") do 130 | page.has_content?('Welcome to your account. Here you can manage all of your personal information and orders.') 131 | end 132 | 133 | ``` 134 | Finalizando, ir no terminal, navegar até a página cucumber e executar o próprio comando cucumber e ver a mágica acontecer e quando terminar o teste, você verá o seguinte resultado: 135 | 136 | ```ruby 137 | Feature: Register 138 | 139 | Scenario: Register on Automation Pratice # features/specifications/register.feature:3 140 | Given I click on Sign in # features/step_definitions/register.rb:1 141 | When I fill in obligatory fields # features/step_definitions/register.rb:6 142 | Then my registration will be successfully made # features/step_definitions/register.rb:27 143 | 144 | 1 scenario (1 passed) 145 | 3 steps (3 passed) 146 | 0m15.603s 147 | ``` 148 | Onde todos os passos foram executados em 15 segundos. Tudo passou =) ... Coisa linda demais. 149 | 150 | Esse é o princípio de tudo pessoal, conceitualmente a automação na camada de UI se resume apenas em: **Abrir Browser, Procurar Elemento, Interagir com Elemento, Fechar Browser.** e quando temos isso bem claro na nossa cabeça fica mais fácil e mais divertido automatizar os testes, pois são as mesmas ações que fazemos ao testar de forma manual, só que agora de forma automatizada. 151 | 152 | Caso goste desse material, não deixem de ver o [Capybara For All - Parte II](https://github.com/thiagomarquessp/capybara_for_all_p2) e divirtam-se. 153 | -------------------------------------------------------------------------------- /Executando_seus_arquivos_Feature.md: -------------------------------------------------------------------------------- 1 | # Executando os trabalhos. 2 | 3 | A primeira coisa a ser feita é escrever a feature a ser testada utilizando Gherkin como base na escrita, como por exemplo: 4 | 5 | ```ruby 6 | Feature: Register 7 | 8 | Scenario: Register on Automation Pratice 9 | 10 | Given I click on Sign in 11 | When I fill in obligatory fields 12 | Then my registration will be successfully made 13 | ``` 14 | Salvar o arquivo com extensão ".feature" na pasta specifications. 15 | 16 | Ideal que a escrita da feature seja feita em inglês pelo simples fato que o uso dessa automação possa ser utilizada pelos POs, e de repente esse PO esteja nos Estados Unidos e o idioma nativo no caso, seria em inglês. Mas isso não é mandatório, podemos fazer nossas features em qualquer idioma, mas pra isso, será necessário no arquivo, na primeira linha colocar o seguinte comando: 17 | 18 | ```ruby 19 | # language: pt 20 | ``` 21 | Com o arquivo.feature pronto, vamos para o nosso terminal executá-lo, então vamos navegar até a pasta cucumber: 22 | 23 | ```ruby 24 | home/workspace/projeto/cucumber 25 | ``` 26 | Nesse caso, vamos executar o próprio comando cucumber: 27 | 28 | ```ruby 29 | cucumber 30 | ``` 31 | O resultado será esse: 32 | 33 | ```ruby 34 | Feature: Register 35 | 36 | Scenario: Register on Automation Pratice # features/specifications/register.feature:3 37 | Given I click on Sign in # features/specifications/register.feature:5 38 | When I fill in obligatory fields # features/specifications/register.feature:6 39 | Then my registration will be successfully made # features/specifications/register.feature:7 40 | 41 | 1 scenario (1 undefined) 42 | 3 steps (3 undefined) 43 | 0m0.007s 44 | 45 | You can implement step definitions for undefined steps with these snippets: 46 | 47 | Given(/^I click on Sign in$/) do 48 | pending # Write code here that turns the phrase above into concrete actions 49 | end 50 | 51 | When(/^I fill in obligatory fields$/) do 52 | pending # Write code here that turns the phrase above into concrete actions 53 | end 54 | 55 | Then(/^my registration will be successfully made$/) do 56 | pending # Write code here that turns the phrase above into concrete actions 57 | end 58 | ``` 59 | Traduzindo: 60 | 61 | ```ruby 62 | Feature: Register 63 | 64 | Scenario: Register on Automation Pratice # features/specifications/register.feature:3 65 | Given I click on Sign in # features/specifications/register.feature:5 66 | When I fill in obligatory fields # features/specifications/register.feature:6 67 | Then my registration will be successfully made # features/specifications/register.feature:7 68 | 69 | 1 scenario (1 undefined) 70 | 3 steps (3 undefined) 71 | 0m0.007s 72 | 73 | Ele executou linha a linha do seu arquivo.feature, onde ele encontrou um cenário com 5 passos de execução. O termo undefined quer dizer que ainda não foi implementado os testes para que esse inglês ou português estruturado possa realizar de fato as ações necessárias para o testes ser concluído; 74 | 75 | You can implement step definitions for undefined steps with these snippets: 76 | 77 | Given("I click on Sign in") do 78 | pending # Write code here that turns the phrase above into concrete actions 79 | end 80 | 81 | When("I fill in obligatory fields") do 82 | pending # Write code here that turns the phrase above into concrete actions 83 | end 84 | 85 | Then("my registration will be successfully made") do 86 | pending # Write code here that turns the phrase above into concrete actions 87 | end 88 | 89 | Esse é o resultado de cada passo a passo criado no arquivo.feature e vamos colocar na cabeça o seguinte: 90 | 91 | 1.Given, When, Then ("bla bla bla bla") do 92 | 93 | end 94 | 95 | Nada mais é que um método, mas de uma maneira mais amigável, fica simples entender o passo a passo apenas para esse pequeno contexto e dessa maneira é mais simples pensar em como devemos testar e com isso, colocar exatamente os comandos necessários para atender essa expectativa. 96 | ``` 97 | Muito bem, e agora, como implementar os testes?? Essa é a parte mais fácil e vamos ver no [próximo item.](https://github.com/thiagomarquessp/capybaraforall/blob/master/Criando_Steps_Definitions.md) 98 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Thiago M Pereira 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Capybara for All ordem de leitura: 2 | 3 | 1. [Readme](https://github.com/thiagomarquessp/capybaraforall/blob/master/README.md); 4 | 2. [Automatizando seus testes com capybara](https://github.com/thiagomarquessp/capybaraforall/blob/master/Automatizando_Seus_Testes_com_Capybara.md); 5 | 3. [Configurações](https://github.com/thiagomarquessp/capybaraforall/blob/master/Configuracoes.md); 6 | 4. [Executando seus arquivos de Feature](https://github.com/thiagomarquessp/capybaraforall/blob/master/Executando_seus_arquivos_Feature.md); 7 | 5. [Criando Steps Definitions](https://github.com/thiagomarquessp/capybaraforall/blob/master/Criando_Steps_Definitions.md). 8 | 9 | O código ta liberado para consulta, fork, clone, etc =). 10 | 11 | Qualquer dúvida, mandem email para thiagomarquessp@gmail.com 12 | 13 | Depois de tudo isso, acesse lá a [parte II:](https://goo.gl/x45qS5) 14 | 15 | Um abraço. 16 | -------------------------------------------------------------------------------- /cucumber/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'cucumber', '~> 3.1' 4 | gem 'capybara', '~> 2.16', '>= 2.16.1' 5 | gem 'selenium-webdriver', '~> 3.8' 6 | -------------------------------------------------------------------------------- /cucumber/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | addressable (2.5.2) 5 | public_suffix (>= 2.0.2, < 4.0) 6 | backports (3.11.1) 7 | builder (3.2.3) 8 | capybara (2.17.0) 9 | addressable 10 | mini_mime (>= 0.1.3) 11 | nokogiri (>= 1.3.3) 12 | rack (>= 1.0.0) 13 | rack-test (>= 0.5.4) 14 | xpath (>= 2.0, < 4.0) 15 | childprocess (0.8.0) 16 | ffi (~> 1.0, >= 1.0.11) 17 | cucumber (3.1.0) 18 | builder (>= 2.1.2) 19 | cucumber-core (~> 3.1.0) 20 | cucumber-expressions (~> 5.0.4) 21 | cucumber-wire (~> 0.0.1) 22 | diff-lcs (~> 1.3) 23 | gherkin (~> 5.0) 24 | multi_json (>= 1.7.5, < 2.0) 25 | multi_test (>= 0.1.2) 26 | cucumber-core (3.1.0) 27 | backports (>= 3.8.0) 28 | cucumber-tag_expressions (~> 1.1.0) 29 | gherkin (>= 5.0.0) 30 | cucumber-expressions (5.0.13) 31 | cucumber-tag_expressions (1.1.1) 32 | cucumber-wire (0.0.1) 33 | diff-lcs (1.3) 34 | ffi (1.9.18) 35 | gherkin (5.0.0) 36 | mini_mime (1.0.0) 37 | mini_portile2 (2.3.0) 38 | multi_json (1.13.1) 39 | multi_test (0.1.2) 40 | nokogiri (1.8.2) 41 | mini_portile2 (~> 2.3.0) 42 | public_suffix (3.0.1) 43 | rack (2.0.4) 44 | rack-test (0.8.2) 45 | rack (>= 1.0, < 3) 46 | rubyzip (1.2.1) 47 | selenium-webdriver (3.8.0) 48 | childprocess (~> 0.5) 49 | rubyzip (~> 1.0) 50 | xpath (3.0.0) 51 | nokogiri (~> 1.8) 52 | 53 | PLATFORMS 54 | ruby 55 | 56 | DEPENDENCIES 57 | capybara (~> 2.16, >= 2.16.1) 58 | cucumber (~> 3.1) 59 | selenium-webdriver (~> 3.8) 60 | 61 | BUNDLED WITH 62 | 1.16.1 63 | -------------------------------------------------------------------------------- /cucumber/features/specifications/register.feature: -------------------------------------------------------------------------------- 1 | Feature: Register 2 | 3 | Scenario: Register on Automation Pratice 4 | 5 | Given I click on Sign in 6 | When I fill in obligatory fields 7 | Then my registration will be successfully made 8 | -------------------------------------------------------------------------------- /cucumber/features/step_definitions/register.rb: -------------------------------------------------------------------------------- 1 | Given("I click on Sign in") do 2 | visit '/index.php' 3 | click_link 'Sign in' 4 | end 5 | 6 | When("I fill in obligatory fields") do 7 | fill_in 'email_create', :with => 'learningcucumber01@test.com' 8 | click_button 'Create an account' 9 | find('#uniform-id_gender1').click 10 | fill_in 'customer_firstname', :with => 'Primeiro Nome' 11 | fill_in 'customer_lastname', :with => 'Sobrenome' 12 | fill_in 'passwd', :with => 'inicial1234' 13 | select '30', from: 'days' 14 | select 'January', from: 'months' 15 | select '1986', from: 'years' 16 | fill_in 'firstname', :with => 'Primeiro Nome Endereco' 17 | fill_in 'lastname', :with => 'Sobrenome Endereco' 18 | fill_in 'address1', :with => 'Rua dos Milagres' 19 | fill_in 'city', :with => 'Alabama Cidade' 20 | select 'Alabama', from: 'id_state' 21 | fill_in 'postcode', :with => '35007' 22 | fill_in 'phone_mobile', :with => '866-234-5382' 23 | fill_in 'alias', :with => 'Alias Exemplo' 24 | click_button 'Register' 25 | end 26 | 27 | Then("my registration will be successfully made") do 28 | page.has_content?('Welcome to your account. Here you can manage all of your personal information and orders.') 29 | end 30 | -------------------------------------------------------------------------------- /cucumber/features/support/env.rb: -------------------------------------------------------------------------------- 1 | require "capybara/cucumber" 2 | require "selenium-webdriver" 3 | 4 | Capybara.register_driver :selenium do |app| 5 | Capybara::Selenium::Driver.new(app, :browser => :firefox) 6 | end 7 | 8 | Capybara.default_driver = :selenium 9 | Capybara.default_max_wait_time = 60 10 | 11 | Capybara.app_host = "http://automationpractice.com/" 12 | --------------------------------------------------------------------------------