├── .gitignore ├── README.md ├── criando_Gemfile.md ├── cucumber ├── Gemfile └── features │ ├── specifications │ └── register.feature │ ├── step_definitions │ └── register.rb │ └── support │ └── env.rb ├── mao_na_massa_faker.md └── trabalhando_com_faker_generator.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *results/ 3 | .DS_Store 4 | *.lock 5 | *report/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Capybara For All parte II - Trabalhando com Faker Generator 2 | 3 | Olá pessoal, nesse repo vamos trabalhar uma gem muito legal para sempre fazer dados dinâmicos e randômicos, justamente para que não precisemos "chumbar" nada no código. 4 | 5 | Na parte I vimos um cadastro onde informamos no nosso teste o nome, o email, o cpf, etc, ou seja, a cada teste, eu vou ter que passar sempre um novo dado para que ele não se repita. 6 | 7 | Bem, a leitura vai ser na seguinte ordem: 8 | 9 | 1. [Criando nosso Gemfile com as gems que realmente vamos precisar;](https://github.com/thiagomarquessp/capybara_for_all_p2/blob/master/criando_Gemfile.md) 10 | 2. [Trabalhando com o Faker Generator;](https://github.com/thiagomarquessp/capybara_for_all_p2/blob/master/trabalhando_com_faker_generator.md) 11 | 3. [Mão na masssa. Criando nosso cadastro com dados Faker;](https://github.com/thiagomarquessp/capybara_for_all_p2/blob/master/mao_na_massa_faker.md) 12 | -------------------------------------------------------------------------------- /criando_Gemfile.md: -------------------------------------------------------------------------------- 1 | # Criando nosso Gemfile. 2 | 3 | O Gemfile é um gerenciador de dependências das gems e é acessado pela gem bundler e basicamente pega as gems que estão no Gemfile e instala junto com suas dependências e quando em algum momento eu precise de uma gem cuja dependência já tenha sido instalada, ela não precisa instalar de novo. 4 | 5 | Outra vantagem do Gemfile é colocar lá as versões de cada gem que eu quero trabalhar. 6 | 7 | Gemfile não tem extensão (.txt, .md, .xpto). 8 | 9 | Vamos criar o nosso arquivo na raiz do nosso projeto com o nome Gemfile (exatamente desse jeito) e vamos colocar o seu conteúdo da seguinte maneira: 10 | 11 | ```ruby 12 | source "https://rubygems.org" 13 | 14 | gem "cucumber" 15 | gem "capybara" 16 | gem "selenium-webdriver" 17 | gem "faker" 18 | gem "cpf_faker" 19 | ``` 20 | Agora vamos instalar a gem bundler: 21 | 22 | ```ruby 23 | gem install bundler 24 | ``` 25 | Agora na raiz do projeto vamos rodar o comando de instalar: 26 | 27 | ```ruby 28 | bundle install 29 | ``` 30 | E será esse o resultado: 31 | 32 | ```ruby 33 | Fetching gem metadata from https://rubygems.org/ 34 | Fetching version metadata from https://rubygems.org/ 35 | Resolving dependencies... 36 | Using addressable 2.4.0 37 | Using builder 3.2.2 38 | Using mime-types-data 3.2016.0521 39 | Using mini_portile2 2.1.0 40 | Using pkg-config 1.1.7 41 | Using rack 1.6.4 42 | Using ffi 1.9.10 43 | Using gherkin 4.0.0 44 | Using cucumber-wire 0.0.1 45 | Using diff-lcs 1.2.5 46 | Using multi_json 1.12.1 47 | Using multi_test 0.1.2 48 | Using i18n 0.7.0 49 | Using rubyzip 1.2.0 50 | Using websocket 1.2.3 51 | Using bundler 1.12.5 52 | Using mime-types 3.1 53 | Using nokogiri 1.6.8 54 | Using rack-test 0.6.3 55 | Using childprocess 0.5.9 56 | Using cucumber-core 1.5.0 57 | Using faker 1.6.3 58 | Using xpath 2.0.0 59 | Using selenium-webdriver 2.53.3 60 | Using cucumber 2.4.0 61 | Using capybara 2.7.1 62 | Bundle complete! 4 Gemfile dependencies, 26 gems now installed. 63 | Use bundle show [gemname] to see where a bundled gem is installed. 64 | ``` 65 | Então observem que além das 4 gems, ele instalou todas as dependências de cada uma delas, ou seja, se precisarmos de qualquer uma gem fora dessas que colocamos no Gemfile, basta eu falar que quero usá-la. 66 | 67 | Agora iremos para a parte II do nosso estudo, [Trabalhando com o Faker Generator](https://github.com/thiagomarquessp/capybara_for_all_p2/blob/master/trabalhando_com_faker_generator.md) 68 | 69 | [Home](https://github.com/thiagomarquessp/capybara_for_all_p2). 70 | -------------------------------------------------------------------------------- /cucumber/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "cucumber" 4 | gem "capybara" 5 | gem "selenium-webdriver" 6 | gem "faker" 7 | gem "cpf_faker" 8 | -------------------------------------------------------------------------------- /cucumber/features/specifications/register.feature: -------------------------------------------------------------------------------- 1 | Feature: Register 2 | 3 | Scenario: Register on Wal Mart 4 | 5 | Given I access the Walmart site 6 | When I click on Register 7 | And fill in the fields 8 | And click Cadastar 9 | Then my registration will be successfully made 10 | -------------------------------------------------------------------------------- /cucumber/features/step_definitions/register.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | Given(/^I access the Walmart site$/) do 3 | visit "https://www.walmart.com.br/" 4 | end 5 | 6 | When(/^I click on Register$/) do 7 | find(:css, '#topbar-signup-link').click 8 | end 9 | 10 | And(/^fill in the fields$/) do 11 | within_frame 'iframeLogin' do 12 | @password = Faker::Base.numerify('Capybara####').to_s 13 | fill_in 'notifymeClientName', with: Faker::Name.name 14 | fill_in 'email', with: Faker::Internet.email('capybaraforall') 15 | fill_in 'cpfcnpj', with: Faker::CPF.numeric 16 | fill_in 'phone', with: Faker::Base.numerify('112419####').to_s 17 | fill_in 'password', with: @password 18 | fill_in 'signupClientPwdCheck', with: @password 19 | find(:css, '#signupButtonSend').click 20 | end 21 | end 22 | 23 | And(/^click Cadastar$/) do 24 | within_frame 'iframeLogin' do 25 | find(:css, '#signupButtonSend').click 26 | end 27 | end 28 | 29 | Then(/^my registration will be successfully made$/) do 30 | page.has_css?('input.suggestion-search', :text => 'Capybara for All', :visible => true) 31 | end 32 | -------------------------------------------------------------------------------- /cucumber/features/support/env.rb: -------------------------------------------------------------------------------- 1 | require "capybara/cucumber" 2 | require "selenium-webdriver" 3 | require "faker" 4 | require "cpf_faker" 5 | 6 | Capybara.default_driver = :selenium 7 | Capybara.default_max_wait_time = 60 8 | -------------------------------------------------------------------------------- /mao_na_massa_faker.md: -------------------------------------------------------------------------------- 1 | # Mão na massa. Agora vamos colocar em prática o Faker \o/ 2 | 3 | Primeiro (e de novo) vamos criar um projeto novo no com o comando: 4 | 5 | ```ruby 6 | cucumber --init 7 | ``` 8 | 9 | Agora vamos criar a mesma estrutura de pastas que criamos na Parte I: 10 | 11 | ```ruby 12 | cucumber 13 | cucumber/features 14 | cucumber/features/specifications 15 | cucumber/features/step_definitions 16 | cucumber/features/support 17 | cucumber/features/support/env.rb 18 | ``` 19 | 20 | Agora vamos criar o arquivo register.feature dentro da pasta specifications da seguinte forma: 21 | 22 | ```ruby 23 | Feature: Register 24 | 25 | Scenario: Register on Wal Mart 26 | 27 | Given I access the Walmart site 28 | When I click on Register 29 | And fill in the fields 30 | And click Cadastar 31 | Then my registration will be successfully made 32 | ``` 33 | Agora .. vamos navegar até a pasta cucumber do nosso projeto e executar o próprio comando cucumber para que ele pegar meu arquivo de feature e estruturar para eu definir os steps. Relembrando, o resultado vai ficar assim: 34 | 35 | ```ruby 36 | Given(/^I access the Walmart site$/) do 37 | pending # Write code here that turns the phrase above into concrete actions 38 | end 39 | 40 | When(/^I click on Register$/) do 41 | pending # Write code here that turns the phrase above into concrete actions 42 | end 43 | 44 | And(/^fill in the fields$/) do 45 | pending # Write code here that turns the phrase above into concrete actions 46 | end 47 | 48 | And(/^click Cadastar$/) do 49 | pending # Write code here that turns the phrase above into concrete actions 50 | end 51 | 52 | Then(/^my registration will be successfully made$/) do 53 | pending # Write code here that turns the phrase above into concrete actions 54 | ``` 55 | 56 | Agora vamos criar o nosso arquivo "register.rb" dentro da pasta features/step_definitions e colar o conteúdo acima dentro dele. 57 | 58 | E o código nesse caso vai ficar assim: 59 | 60 | ```ruby 61 | # encoding: utf-8 62 | Given(/^I access the Walmart site$/) do 63 | visit "https://www.walmart.com.br/" 64 | end 65 | 66 | When(/^I click on Register$/) do 67 | find(:css, '#topbar-signup-link').click 68 | end 69 | 70 | And(/^fill in the fields$/) do 71 | within_frame 'iframeLogin' do 72 | @password = Faker::Base.numerify('Capybara####').to_s 73 | @name = Faker::Name.name 74 | fill_in 'notifymeClientName', with: @name 75 | fill_in 'email', with: Faker::Internet.email('capybaraforall') 76 | fill_in 'cpfcnpj', with: Faker::CPF.numeric 77 | fill_in 'phone', with: Faker::Base.numerify('112419####').to_s 78 | fill_in 'password', with: @password 79 | fill_in 'signupClientPwdCheck', with: @password 80 | find(:css, '#signupButtonSend').click 81 | end 82 | end 83 | 84 | And(/^click Cadastar$/) do 85 | within_frame 'iframeLogin' do 86 | find(:css, '#signupButtonSend').click 87 | end 88 | end 89 | 90 | Then(/^my registration will be successfully made$/) do 91 | find(:css, '.profile-img').click 92 | page.has_css?('.sh-value.ng-binding', :text => @name, :visible => true) 93 | end 94 | ``` 95 | Antes de alguém se perguntar "Que porra é essa de @password" eu respondo... Como os dados são aleatórios, se eu colocar em dois lugares o mesmo Faker, eles vão gerar valores diferentes, então no caso do password, que eu tenho que colocar a mesma informação tanto no password como na confirmação do password, os valores tem que ser iguais e ai eu peguei, defini uma variável (@password) e armazenei o Faker dentro dela, e toda vez que eu colocar o @password em algum lugar, ele vai me jogar o conteúdo de dentro dele (no caso um nome). O mesmo se aplica para a variável @name que eu armazenei um Faker dentro dela para conseguir ver se o usuário que eu realmente cadastrei foi cadastrado com sucesso. Alguns não gostam dessa prática, mas para quem ta começando, fazer isso é uma forma de prestar atenção em tudo que é desenvolvido =). Um outro tópico (capybaraforall_diversos) eu vou falar um pouco de boas práticas, macetes, etc. 96 | 97 | Quando executar o teste, o resultado será esse: 98 | 99 | ```ruby 100 | Feature: Register 101 | 102 | Scenario: Register on Wal Mart # features/specifications/register.feature:3 103 | Given I access the Walmart site # features/step_definitions/register.rb:2 104 | When I click on Register # features/step_definitions/register.rb:6 105 | And fill in the fields # features/step_definitions/register.rb:10 106 | And click Cadastar # features/step_definitions/register.rb:23 107 | Then my registration will be successfully made # features/step_definitions/register.rb:29 108 | 109 | 1 scenario (1 passed) 110 | 5 steps (5 passed) 111 | 0m22.022s 112 | ``` 113 | Executado em 22 segundos e toda vez que você executar esse teste, serão gerados dados aleatórios e você nunca vai repetir dados no seus teste. 114 | 115 | Obs.: No caso do Walmart, quando você executa várias vezes o mesmo teste, ele coloca captcha. No próximo episódio vou tentar outro site pra brincarmos =). Não compensa eu falar de captcha agora se não conseguimos andar com as próprias pernas. 116 | 117 | O princípio é esse galera. Usar dados aleatórios, usar os comandos básicos, salvar a cada sucesso, tentar e tentar e tentar até conseguir. 118 | 119 | O repositório está ai para consulta. Mas tentem aplicar essas técnicas iniciais em algum outro site. 120 | 121 | No próximo bloco (rsrs) vamos falar um pouco sobre como utilizar Page Objects e ai as coisas vão começar a ficar legais. Não vai sair do dia pra noite esse porque quero achar a melhor forma de explicar esse conceito de uma maneira tranquilinha sem gerar bloqueios. 122 | 123 | Qualquer dúvida meu email é thiagomarquessp@gmail.com e para críticas também. 124 | 125 | [Home](https://github.com/thiagomarquessp/capybara_for_all_p2). -------------------------------------------------------------------------------- /trabalhando_com_faker_generator.md: -------------------------------------------------------------------------------- 1 | # Trabalhando com dados aleatórios utilizando as gems Faker e CPF Faker. 2 | 3 | Uma vez que as gems já estão instaladas, basta agora saber como trabalhar com elas. Eu vou passar aqui os dados genéricos que são bastante utilizados, porém, podemos acessar o github da própria gem para poder ver outras coisoas. 4 | 5 | O ruby tem o console dele (irb) que serve para podermos "testar" qualquer coisa antes de sair por aí implementando. 6 | 7 | Vamos agora chamar o Faker para a jogada lá no nosso arquivo support/env.rb e vao ficar da seguinte maneira nosso arquivo env: 8 | 9 | ```ruby 10 | require "capybara/cucumber" 11 | require "selenium-webdriver" 12 | require "faker" 13 | require "cpf_faker" 14 | 15 | Capybara.default_driver = :selenium 16 | Capybara.default_max_wait_time = 60 17 | ``` 18 | 19 | Então nesse arquivo definimos: 20 | 21 | ```ruby 22 | require "capybara/cucumber" -- Para usar Gherkin e usar os comandos do Framework Capybara. 23 | require "selenium-webdriver" -- Para usar o driver que no caso é o próprio Selenium Webdriver. 24 | require "faker" -- Para conseguir usar dados genéricos. 25 | require "cpf_faker" -- Para usar dados de cpf genéricos. 26 | ``` 27 | 28 | ```ruby 29 | Capybara.default_driver = :selenium -- Deixando claro que o driver que será rodado por baixo será o Selenium (em outro tópico eu lido com outras maneiras de trabalhar o driver, por exemplo, rodar em headles com webkit). 30 | Capybara.default_max_wait_time = 60 -- Tempo antes de dar Time Out. 31 | ``` 32 | Beleza ... abaixo vou colocar alguns comandos do Faker que mais fazem sentido: 33 | 34 | ```ruby 35 | Faker::Name.name = Para nomes aleatórios; 36 | "Jhon Dee" 37 | 38 | Faker::Lorem.paragraph(2) = Para escrever Lorem e entre ( ) colocar quantos parágrafos. 39 | "Minima aliquam voluptas commodi quos. Praesentium aut debitis tempora. Eos labore accusantium ducimus. Voluptatem labore omnis vitae voluptas." 40 | 41 | Faker::Company.name = Para nomes de empresa aleatórios. 42 | "Reichert-Halvorson inc." 43 | 44 | Faker::Base.numerify('112419####') = Eu utilizo para Senhas aleatórias, "# é utilizado para números aleatórios.". Mas no caso, pra qualquer base numérica. 45 | 46 | Faker::Number.number(10) = Para números aleatórios e entre ( ) quantos números vc quer trabalhar. 47 | 48 | Faker::Internet.email = Para emails aleatórios. 49 | "marcos_zulauf@ortiz.org" 50 | 51 | Faker::Internet.email('capybaraforall') = Para gerar email com prefixo específico entre ( ). 52 | "capybaraforall@schuster.info" 53 | 54 | Faker::CPF.numeric = Para gerar CPFs aleatórios. 55 | "38012932970" 56 | 57 | Faker::Date.forward(23) = Para gerar datas aleatórias. Entre ( ) nesse caso é para definir quantos dias a frente você quer definir e o faker vai gerar a data aleatória dentro desse período. 58 | "2016-06-23" 59 | 60 | Faker::Internet.url = Definir urls aleatórias. 61 | "http://thiel.com/chauncey_simonis" 62 | 63 | Faker::Internet.url('capybaraforall.com') = Para urls aleatórias com o prefixo definido entre ( ). 64 | "http://capybaraforall.com/clotilde.swift" 65 | 66 | Off Topic Faker: 67 | 68 | Faker::StarWars.character 69 | "Anakin Skywalker" 70 | 71 | Faker::StarWars.droid 72 | "C-3PO" 73 | 74 | Faker::Beer.name 75 | "Hercules Double IPA" 76 | 77 | Faker::ChuckNorris.fact 78 | "Chuck Norris can solve the Towers of Hanoi in one move." 79 | ``` 80 | 81 | O github da gem é: https://github.com/stympy/faker para mais itens =). 82 | 83 | # Agora como vamos utilizar??? 84 | 85 | Exemplo: 86 | 87 | ```ruby 88 | fill_in 'name', :with Faker::Name.name 89 | find(:css, '#name').set(Faker::Name.name) 90 | ``` 91 | [E então, vamos para a prática no final do nosso material.](https://github.com/thiagomarquessp/capybara_for_all_p2/blob/master/mao_na_massa_faker.md) --------------------------------------------------------------------------------