twitterfacebookgoogle pluslinkedinrss feedemail

quarta-feira, 29 de agosto de 2018

Petí Restaurante

O Petí é um restaurante que serve comida boa, de qualidade, feita com técnica e ingredientes frescos a um preço super justo. O menu degustação sazonal muda a cada 15 dias e inclui entrada + prato principal + sobremesa, no valor de R$47,00. 
O Chef Victor Dimitrow faz um excelente trabalho, vela e pena uma visita ao restaurante!
Ele é recomendado pela guia Michelin e certamente irei voltar várias vezes... 
Serviço:
Petí Restaurante

Endereço:
Rua Cotoxó nº 110 - São Paulo
[11] 3873 - 0099
E-mail: eventos@petirestaurante.com.br

Outras Unidades:
Higenópolis
Av. Angelica, 1900 - 4ºandar
01228 200 - São Paulo- SP
[11] 3661 9685

Jardins
R.Groenlândia, 77 - 2ºandar
01434 000 - São Paulo - SP
[11] 3885 5143

* Valores confirmados na data de postagem.
** Reflete uma opinão pessoal, não sou especialista.

quinta-feira, 23 de agosto de 2018

Jenkins - Configurar "Seed Job"

Jenkins é uma plataforma poderosa para automatizar tarefas.
Através de seus diversos plugins, complementamos as funcionalidades e escopo.
Oferecendo tantas facilidades, o Jenkins livra o desenvolvedor das atividades repetitivas.
Vou apresentar neste artigo o plugin "job-dsl-plugin", que é responsável pela implementação do "seed-job".

O que é "job-dsl-plugin"?
É um plugin que implementa a funcionalidade do desenvolvedor descrever "jobs" usando Groovy.
Na prática, podemos criar um arquivo com diversos comandos, que serão interpretados no Jenkins com o objetivo de criar e configurar um ou vários  "Jobs".
Assim, evitando o trabalho de utilizar a UI do Jenkins para configurar os Jobs.

Qual o benefício de utilizar o plugin?
Quando operamos o Jenkins para criar o Job, entramos na interface do usuário, criando um novo item, adicionando parâmetros, adicionando "steps", tudo isso manualmente na UI.
Quando o número de Jobs cresce, começa a ficar difícil a manutenção destes Jobs utilizando a UI. Imagina se tivermos que fazer uma alteração em todos os jobs, teríamos que entrar um por um.
Em um cenário que o servidor do Jenkins sofre um problema, perde informações dos Jobs ou simplesmente precisamos replicar jobs parecidos para outros sistemas, utilizando o "job-dsl-plugin" fica mais fácil.
Podemos versionar os arquivos de configuração dos Jobs em Groovy no Git, por exemplo. Assim, podemos reverter alterações nos Jobs de uma forma fácil.
A grande vantagem é que podemos programar nossos jobs, ao invés de ficar clicando em um monte de tela.

Instalar o Plugin
Na opção "Manage Jenkins",  "Plugin Manager" clicar na Aba "Installed".
Procurar pelo plugin "Job DSL".
Caso não tenha instalado, entrar na aba "Available" e buscar por "Job Dsl".

Configurando "Seed-Job"
O "Seed-Job" é um job que irá fazer um clone de um repositório remoto, interpretrar os arquivos DSL e gerar outros Jobs.
O primeiro passo é termos um repositório no Git, destinado a versionar os arquivos DSL. 
Na home do Jenkins, escolhemos a opção "New Item".
Depois defina o nome do Job, escolha a opção "Freestyle Project".


Na próxima tela, buscar a opção de "Build", no combo de "Add Build step", selecionar a opção "Process Job DSLs".
No campo "DSL Scripts", incluir a opção de "*.dsl", definindo que iremos pegar todos arquivos com extensão dsl.


Na seção de "Source Code Management", preencher informações do repositório. No caso do Git, colocar a URI do repositório e o certificado do usuário que foi registrado no Jenkins.
Com estas informações, a ferramenta irá fazer o clone do repositório com os arquivos "*.dsl" necessários para gerar outros jobs.


 Salvar este Job, que posteriormente iremos executar ele.

Hello World - DSL

Os scripts em DSL são programados utilizando Groovy.
Para exemplo do nosso  "Seed Job", crie um arquivo *.dsl no seu repositório de arquivos, com o conteúdo abaixo:
job('JobEcho-Teste'){
        steps{
                shell('echo "Teste - Ola Mundo!"')
        }
}

Versionar o arquivo e executar o "git push" para o servidor remoto do Git. 
Clicando no Job de Seed, iremos executar um build.
O Job de Seed irá executar e criar um novo job, chamado  "JobEcho-Teste", que foi configurado no arquivo DSL de exemplo.


Entrando no JobEcho-Teste, executamos o build desse job. Se ocorreu tudo certo, o build deverá estar verde.

Depois entramos no build do job e clicamos em "Console Output".

No console vemos o retorno de nosso "Olá Mundo".
Um outro exemplo simples, para ilustrar o funcionamento do DSL.
O script abaixo, cria um job que faz clone de um repositório no GitHub.
job('NomeJob') {
    scm {
        git {
            remote {
                github('account/repo', 'ssh')
                credentials('CredencialCadastrada')
                url('git@github.com:ROMERO/URIGitHub.git')
            }
        }
    }
}

Existem diversos comandos DSL que ajudam a automatizar a criação de Jobs.
Uma boa referência para os comandos é no link abaixo:

Outros links interessantes:

quarta-feira, 15 de agosto de 2018

A Casa do Porco Restaurante

Grata surpresa na visita ao restaurante "A Casa do Porco".
Para quem gosta de carne suína, não irá se arrepender.
Comandado pelo Chef Jefferson Rueda, o mesmo do premiado Dona Onça, temos uma imensa variedade de cortes de porco.
Sendo um restaurante badalado, a fila de espera é grande. Como ele fica perto do edifico Copan, ficamos na rua esperando a mesa.
Seguranças do restaurantes ficam espantando os crakudos que vêem pedir dinheiro e sua caipirinha de caju.
O restaurante tem um balcão voltado para a rua onde podemos pedir petiscos e bebidas.
Pedi o menu degustação, 95 reais, preço justo pela variedade.
Somente achei muito exótico o sushi de porco, meu paladar não aceita muito essa fusion com comida japonesa.
Vale a pena conhecer esse restaurante, vão com paciência que irão se deliciar com variedades de pratos suínos.



Serviço:
Endereço: R. Araújo, 124 - República, São Paulo - SP, 01220-020, Brasil
Telefone: +55 11 3258-2578

* Valores confirmados na data de postagem.
** Reflete uma opinão pessoal, não sou especialista.

quarta-feira, 1 de agosto de 2018

Tartar&Co Restaurante

Estava ansioso em conhecer o restaurante Tartar&Co do chef Érick Jacquin, o jurado francês do Master Chef.
Em resumo: esperava mais do local e comida, não recomendo este restaurante.
Acho que pelo que vejo do Érick Jacquin, esperava um ambiente mais conservador, fiquei supreso em o Tartar&Co ser descolado.
A maioria dos ambientes são escuros, não conseguia ler o confuso cardápio, tive que me esforçar para encontrar luz para conseguir escolher.
São vários cardápios e os garçons atrapalhados sempre esquecem de um e você tem que ficar perguntando toda hora.
As mesas são bem pequenas, faltando um pouco de requinte, utilizando-se de um papel de bandeija menos divertido que o do Mac Donalds para acomodar os pratos.
O surpreendente da cozinha é a velocidade de entrega do serviço, os cozinheiros devem ter sido treinados na base da chatice do Jacquin.
Os ingredientes são frescos, tirando um pão artesanal duro (não colocaram no forno para amolecer) que veio junto com as ostras.
A comida é boa, nada surpreendente.
Vale como experiência e quem sabe um dia ele faça um episódio de "Pesadelo na Cozinha" no próprio restaurante.



Serviço:
Tartar&Co

Av. Pedroso de Morais, 1003 - Pinheiros, São Paulo - SP, 05419-000, Brasil
Telefone: +55 11 3031-1020

* Valores confirmados na data de postagem.
** Reflete uma opinão pessoal, não sou especialista.

terça-feira, 31 de julho de 2018

New Shin-la Kwan Restaurante

Churrasco... Samba, caipirinha, picanha... Nada disso!
O churrasco coreano é de pato e costela, com som de exaustor, com o delicioso fermentado de batata doce e arroz (Soju). Os acompanhamentos são deliciosos, como o kimchi que é um condimento de um tipo de acelga. Para Fortes!
Conhecer outras culturas, não precisamos sair de São Paulo.



Serviço:
New Shin-la kwan
Endereço: Rua Prates, 343 - Bom Retiro, São Paulo - SP, 01121-000, Brasil
Telefone: +55 11 3315-9021

sábado, 9 de junho de 2018

Hospedaria Restaurante

Definem a comida como sendo comida de Imigrante Italiano. Receitas simples, tendo como aliado um forno a lenha para finalização dos pratos.
Destaque para o ambiente e decoração que é um galpão fabril, como muitos na Mooca.
Preço justo para pratos que são de imigrantes: simples, rústicos e economia de ingredientes caros.
Cardápio com poucas opções e sobremesas que não empolgam.
Contudo, comida saborosa e vale uma visita para conhecer o restaurante.



Serviço:
Hospedaria Restaurante

Endereço: R. Borges de Figueiredo, 82 - Mooca, São Paulo - SP, 03110-010, Brasil

* Valores confirmados na data de postagem.
** Reflete uma opinão pessoal, não sou especialista.

sexta-feira, 16 de fevereiro de 2018

Selenium WebDriver: Tempo de Espera Explícito e Implícito




Podemos utilizar um tempo de espera para mitigar erros ao tentar acessar elementos utilizando o Selenium WebDriver.
Como exemplo usamos a linguagem Java e levarei em consideração que já utiliza o WebDriver, apresentando este recurso avançado.

Imaginamos que você tenha um teste automatizado que acessa os elementos da página de login e no botão de "OK" é enviado a ação de clicar.
Depois é redirecionado para outra página do sistema, onde tenho que clicar em outro botão confirmando o meu login.
Por infelicidade do destino, apresenta um erro ao tentar acessar o elemento do botão da segunda página.
Para ilustrar, repare no código abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class LoginPage {

 WebDriver driver;
 
 //Mapeamento dos Elementos da Página de Login
 @FindBy(id="Login")
 WebElement usuario;
 
 @FindBy(how=How.NAME,using="Senha")
 WebElement password;
 
 @FindBy(how=How.ID, using="BtnOK")
 WebElement botaoOK;
 
 @FindBy(how=How.ID, using="BtnConfirmaOK")
 WebElement confirmacaoBotaoSucess;
 
 
 public LoginPage(WebDriver driver) {
  super();
  this.driver = driver;
 }

 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();

  // Erro ocorre ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 
}

O erro é o bendito abaixo:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element

O erro é claro que não conseguiu localizar o elemento.
Acontece que quando redireciona de uma página para a outra, não temos um tempo de espera entre os passos (steps).
Este tempo seria o de renderizar a página, podendo neste tempo ocorrer lentidão na rede, servidores, etc.

Uma grande parcela de automatizadores utilizam o método Thread.sleep(), esta abordagem é errada, não sendo eficiente.
O sleep espera o tempo definido, assim podendo aumentar muito o tempo do seu teste e não evitando se tivermos uma demora maior na renderização da página.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
  
  //Abordagem errada é definir um tempo de espera fixo, utilizando o método abaixo.
  Thread.sleep(3000);
   
  // Erro ocorre ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 
}

A documentação do WebDriver recomenda duas formas de definir um tempo de espera.
O "Explicit and Implicit Waits" tem duas abordagens distintas.
Primeiramente, vamos definir o que é Implícito e Explícito.
Nosso velho amigo dicionário diz:

Implícito
O adjetivo implícito indica algo que não está claramente expresso, que está subentendido.
É sinônimo de subentendido, subjacente, latente, tácito e velado.

Explícito
O adjetivo explícito indica algo que está expresso de forma clara e precisa, sem ambiguidades ou restrições. É sinônimo de claro, manifesto, patente, preciso, categórico, terminante, declarado e compreensível.

O implícito é o mais usual e simples.
Defininos um tempo de timeout para todo o escopo de nossos testes.
Conforme o código abaixo, definimos o tempo de 60 segundos de timeout.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 public void fazerLogin(String uid, String pass){
  
  //define um TimeOut para em caso de não encontrar elementos na página.
  driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);  

 
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
   
  // Não irá occorer erro ao tentar acessar o elemento do botão que está em outra página.  
  confirmacaoBotaoSucess.click();
 } 

Definindo o driver.manage().timeouts().implicitlyWait(), o WebDriver irá demorar o tempo definido para gerar a exceção de erro.
Ele verifica a cada 500 milissegundo se o elemento referenciado foi criado.
Assim evitando o erro de NoSuchElementException e sendo uma forma eficiente, evitando de utilizar o Thread.sleep().
O valor do método implicitlyWait() pode ser definido logo após a criação do objeto driver, não sendo necessário definir esse valor toda hora.

A forma explícita é definida pelo tempo de espera para cada elemento.
No código abaixo, identificamos a criação do objeto WebDriverWait.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 public void fazerLogin(String uid, String pass){
  
  // Define os valores de Login e Senha.
  usuario.sendKeys(uid);
  password.sendKeys(pass);
  
  // Envia ação de clicar no botão OK e redireciona para outra página.
  botaoOK.click();
   
  //Segunda Tela onde é redirecionado depois do login.
  //===> Usando recurso de Wait, para evitar exception de encontrar elemento na tela.
  WebDriverWait wait = new WebDriverWait(driver, 10);
  WebElement btnConfirmarOK = wait.until(ExpectedConditions.visibilityOf(confirmacaoBotaoSucess));
  btnConfirmarOK.click();
 }

Utilizando o objeto WebDriverWait definimos o tempo de timeout e através do método until dizemos a condição que esperamos.
Em casos que a aplicação fica processando um lote por tempo indefinido, onde irá cair por timeout implícito, a utilização do tempo de espera explícito é necessário.

ATENÇÃO:
Não misture os tempos de espera implícito e explícito.
O tempo de espera fica imprevisível, assim não sendo possível dizer quanto tempo irá demorar.
Quando for necessário utilizar o tempo de espera explícito, defina como:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

 

Sobre o Blog

Neste blog irei compartilhar as minhas experiências e observações. Os temas serão variados, mas com ênfase em tecnologia. Inscreva-se nos nossos canais para receber atualizações.