<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Rafael Chiavegatto]]></title><description><![CDATA[Automação de testes e práticas de desenvolvimento ágeis ]]></description><link>https://rafaelchiavegatto.com.br/</link><generator>Ghost 0.11</generator><lastBuildDate>Wed, 08 Apr 2026 21:32:53 GMT</lastBuildDate><atom:link href="https://rafaelchiavegatto.com.br/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Utilizando o Ansible para provisionar ambientes]]></title><description><![CDATA[<p>Depois de um tempo sem postar, venho falar de uma ferramenta que gosto muito: o <a href="https://www.ansible.com/">Ansible</a>. Para mostrar como funciona o Ansible, criaremos um blog na plataforma <a href="https://ghost.org/pt_BR/">Ghost</a> e esse será executado em um container Docker utilizando a <a href="https://hub.docker.com/_/ghost/">imagem Ghost</a>. Veremos como utilizar o Ansible e de quebra, como usá-lo</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/10/11/utilizando-o-ansible-para-provisionar-ambientes/</link><guid isPermaLink="false">94c1011f-1da0-4194-8f1a-eb8c991b1231</guid><category><![CDATA[docker]]></category><category><![CDATA[ansible]]></category><category><![CDATA[ghost]]></category><category><![CDATA[provisionamento]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Tue, 11 Oct 2016 02:23:08 GMT</pubDate><content:encoded><![CDATA[<p>Depois de um tempo sem postar, venho falar de uma ferramenta que gosto muito: o <a href="https://www.ansible.com/">Ansible</a>. Para mostrar como funciona o Ansible, criaremos um blog na plataforma <a href="https://ghost.org/pt_BR/">Ghost</a> e esse será executado em um container Docker utilizando a <a href="https://hub.docker.com/_/ghost/">imagem Ghost</a>. Veremos como utilizar o Ansible e de quebra, como usá-lo juntamente com uma imagem Docker.</p>

<h4 id="vamosaprenderautilizaroansible">Vamos aprender a utilizar o Ansible:</h4>

<p>Uma visão geral da estrutura de pastas do Ansible:</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/09/Captura-de-tela-de-2016-09-30-17-01-44.png" alt=""></p>

<h5 id="inventory">Inventory:</h5>

<p>Na pasta <strong>hosts</strong> definimos o inventário das nossas máquinas que serão executados os playbooks (já veremos o que isso significa), no exemplo abaixo, temos um inventário chamado de blog-server, que contém apenas uma máquina inventariada.</p>

<script src="https://gist.github.com/chiavegatto/e4cfba1d282d16fd137112ff99c86679.js"></script>

<p>Poderíamos ter outros inventários no mesmo arquivo ou outras máquinas inventariadas. Bastaria adicionar o endereço, login e senha dos outros servidores.</p>

<h5 id="ansiblecfg">Ansible.cfg:</h5>

<p>No arquivo <strong>ansible.cfg</strong> definimos qual será o inventário padrão e ignoramos a pergunta relacionada ao desejo de adicionar o IP da máquina ao arquivo known_hosts.</p>

<script src="https://gist.github.com/chiavegatto/3edba6be218f9984b54c6a559fccee56.js"></script>

<h5 id="playbooks">Playbooks:</h5>

<p>Podemos dizer que um <strong>playbook</strong> é uma receita, onde é definido o que será provisionado nos nossos inventários. Fazendo uma analogia, seria um passo a passo para uma receita de bolo.</p>

<script src="https://gist.github.com/chiavegatto/c698d18f23e6d9f2e2c31bc0a8325b3a.js"></script>

<p>Nesse exemplo temos 3 passos a serem executadas, config-basic, docker, start-services. É importante dizer que esses passos são executados sequencialmente. Abaixo veremos o que cada um deles faz:</p>

<h5 id="roles">Roles:</h5>

<p>Na pasta <strong>roles</strong> temos o seguinte formato:</p>

<pre><code>Roles
  config-basic
    files
    tasks
  docker
    files
    tasks
  start-services
    files
    tasks
</code></pre>

<p>Dentro de cada role, existe a pasta <strong>files</strong>, onde ficam os arquivos que serão utilizados para configurar algo no provisionamento do ambiente. Dentro da pasta <strong>tasks</strong> ficam as tarefas que serão executadas para provisionar o ambiente desejado. Por padrão o Ansible sempre procura dentro da pasta tasks um arquivo <strong>main.yml</strong>.</p>

<blockquote>
  <p>config-basic:</p>
</blockquote>

<p>Abaixo temos o nosso arquivo main.yml com tarefas para configurar: timezone, language, criação de um usuário, adicionar o usuário no grupo de sudo e instala o unzip na máquina provisionada.</p>

<script src="https://gist.github.com/chiavegatto/e903c825e536257f9fe6d8d83649f18d.js"></script>

<blockquote>
  <p>Docker:</p>
</blockquote>

<p>Dentro da pasta files temos um arquivo do docker-compose.yml para subir o blog que desejamos na máquina provisionada.</p>

<script src="https://gist.github.com/chiavegatto/b3fbcd4b0aa9a60e0525a662ac8253b0.js"></script>

<p>Dentro da pasta tasks temos uma tarefa para adicionar o arquivo docker-compose.yml para dentro da home do usuário. </p>

<script src="https://gist.github.com/chiavegatto/82c660563968ada0da7b4de187fe2dde.js"></script>

<p>Agora tempos a tarefa para instalar o Docker na máquina que irá ser provisionada.</p>

<script src="https://gist.github.com/chiavegatto/d2179c28bc4c0b7c883102826b8a2e52.js"></script>

<p>Próxima tarefa é para instalar o docker-compose na máquina provisionada.</p>

<script src="https://gist.github.com/chiavegatto/929a19b941ce83b8a720f281f558c893.js"></script>

<p>Agora o arquivo main.yml tem apenas os imports das tarefas que estão na mesma role, dessa forma, fica mais organizado do que adicionar todas as tarefas no mesmo arquivo.</p>

<script src="https://gist.github.com/chiavegatto/31200caba41ab133647f7e2d68c8cddc.js"></script>

<blockquote>
  <p>Start-services:
  E por último, vamos executar o comando para "startar" o serviço com o docker-compose.</p>
</blockquote>

<script src="https://gist.github.com/chiavegatto/2793bba8d826ea5ec1de7536792628b0.js"></script>

<p>Para provisionar uma máquina e rodar o blog com o Ghost, basta executar o comando:</p>

<pre><code>ansible-playbook blog-server.yml
</code></pre>

<p>Ao executar este comando será apresentada a imagem abaixo, quando finalizar o provisionamento do nosso blog.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/10/Captura-de-tela-de-2016-10-10-18-06-25.png" alt=""></p>

<p>Ao acessar a máquina que provisionamos, podemos ver o nosso blog em execução, pronto para configurarmos.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/10/Captura-de-tela-de-2016-10-10-18-08-12.png" alt=""></p>

<p>É isso pessoal, espero que tenham gostado desse post. 
Até o próximo.</p>

<h6 id="referencias">Referencias</h6>

<p><a href="http://docs.ansible.com/ansible/playbooks_best_practices.html">http://docs.ansible.com/ansible/playbooks<em>best</em>practices.html</a>
<a href="https://www.ansible.com/">https://www.ansible.com/</a></p>]]></content:encoded></item><item><title><![CDATA[Deixando o Jenkins fazer o trabalho manual - Parte 3 - Mobile]]></title><description><![CDATA[<p>Olá pessoal! Escrevendo mais um post da série sobre Jenkins, vocês podem conferir outros posts da série aqui ->  <a href="http://rafaelchiavegatto.com.br/tag/jenkins/">Deixando o Jenkins fazer o trabalho manual </a>. Neste post vamos executar nossos testes automatizados com <a href="http://appium.io/">Appium</a> e deixar nosso "BBF" <a href="https://jenkins.io/">Jenkins</a> executá-los. </p>

<p>É necessário ter configurado:</p>

<ul>
<li><a href="http://developer.android.com/sdk/index.html">Android SDK</a></li>
<li><a href="https://nodejs.org/en/">Node</a></li>
<li><a href="http://appium.io/">Appium</a> </li>
<li><a href="http://www.oracle.com/technetwork/pt/java/javase/downloads/index.html">Java</a></li></ul>]]></description><link>https://rafaelchiavegatto.com.br/2016/04/26/deixando-o-jenkins-fazer-o-trabalho-manual-parte-3-mobile/</link><guid isPermaLink="false">45550d3f-27c6-4e9b-8e0c-3a534e9a4567</guid><category><![CDATA[jenkins]]></category><category><![CDATA[appium]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Tue, 26 Apr 2016 12:40:34 GMT</pubDate><content:encoded><![CDATA[<p>Olá pessoal! Escrevendo mais um post da série sobre Jenkins, vocês podem conferir outros posts da série aqui ->  <a href="http://rafaelchiavegatto.com.br/tag/jenkins/">Deixando o Jenkins fazer o trabalho manual </a>. Neste post vamos executar nossos testes automatizados com <a href="http://appium.io/">Appium</a> e deixar nosso "BBF" <a href="https://jenkins.io/">Jenkins</a> executá-los. </p>

<p>É necessário ter configurado:</p>

<ul>
<li><a href="http://developer.android.com/sdk/index.html">Android SDK</a></li>
<li><a href="https://nodejs.org/en/">Node</a></li>
<li><a href="http://appium.io/">Appium</a> </li>
<li><a href="http://www.oracle.com/technetwork/pt/java/javase/downloads/index.html">Java JDK</a> </li>
<li><a href="https://www.genymotion.com/">Genymotion</a></li>
</ul>

<h4 id="vamoscomear">Vamos começar</h4>

<p>A aplicação que iremos testar é simples, ela faz o controle de abastecimentos realizados no mês.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/04/Imagem1.png" alt=""></p>

<p>Vamos utilizar o Maven e como vimos no post anterior, para isso devemos ter o arquivo pom.xml com nossas dependências.</p>

<script src="https://gist.github.com/chiavegatto/a4665a3d7f573c3e1d7b21f8bd008374.js"></script>

<p>Criaremos agora nossa classe base para os demais testes:</p>

<script src="https://gist.github.com/chiavegatto/ccef7785327202fd9f265e5ae9d2dc8e.js"></script>

<p>Então iremos criar nossas pages:</p>

<script src="https://gist.github.com/chiavegatto/5d2121b331906fe289ee7519e0b9889d.js"></script>

<p>Agora basta criar os testes que utilizarão as pages criadas:</p>

<script src="https://gist.github.com/chiavegatto/48b49cb5d392372eb552c1aea86528f5.js"></script>

<p>Temos nossos testes funcionando, mas para serem executados ainda precisamos executá-los de forma manual. É nessa hora que o Jenkins vai nos ajudar a executá-los e deixando-nos livres de realizar esse trabalho manual.</p>

<h4 id="devicesdispositivos">Devices (Dispositivos)</h4>

<p>Nem sempre temos nossos targets (dispositivos) "plugados" em nosso servidor de integração contínua, nesse caso, irei utilizar o <a href="https://www.genymotion.com/">Genymotion</a> para simular um device com a API 22 do Android.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/04/Captura-de-tela-de-2016-04-18-22-58-58.png" alt=""></p>

<p>Para adiantar nosso trabalho no Jenkins, vamos executar o seguinte comando no terminal:</p>

<p>| VBoxManage list vms</p>

<p>O resultado da execução desse comando, são os nomes das VM's que possuímos em nossa máquina, no meu caso lista a seguinte VM:</p>

<p>| "Google Nexus 5 - API 22" {1483f101-24a2-45c9-87f2-043de64ca883}</p>

<h4 id="configurandoojenkins">Configurando o Jenkins</h4>

<p>Criaremos o nosso projeto no Jenkins.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/04/Captura-de-tela-de-2016-04-18-23-04-22.png" alt=""></p>

<p>Agora basta configurar o repositório do projeto, no exemplo, estou utilizando um projeto que está no <a href="https://github.com/chiavegatto/Consumo-Gasolina-Appium">github</a>.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/04/Captura-de-tela-de-2016-04-25-14-04-47.png" alt=""></p>

<p>Vamos configurar para "startar" o emulador do gennymotion.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/04/Captura-de-tela-de-2016-04-25-14-17-59.png" alt=""></p>

<p>| /mnt/rafael/desenvolvimento/genymotion/player --vm-name "Google Nexus 5 - API 22"</p>

<p>O comando abre o emulador do Gennymotion, porém tenho que esperar alguns segundos para iniciar a execução dos testes.</p>

<p><strong>OBS.:</strong> Caso tenha um dispositivo conectado não é necessário o passo acima.</p>

<p>Configuraremos o Maven com <strong>clean</strong> e <strong>install</strong> para executar nossos testes e mandaremos construir nosso build, com isso, finalmente teremos nossos testes automatizados sendo executados pelo Jenkins.</p>

<p>Aqui termino a série de posts sobre <a href="http://rafaelchiavegatto.com.br/tag/jenkins/">Deixando o Jenkins fazer o trabalho manual</a>. Espero que tenham gostado e que o conteúdo dos posts tenham servido para agregar conhecimento e disseminar a troca de informações. Até breve pessoal!</p>]]></content:encoded></item><item><title><![CDATA[Deixando o Jenkins fazer o trabalho manual - Parte 2]]></title><description><![CDATA[<p>Olá pessoal! Depois de alguns dias curtindo uma praia :) , aqui estamos de volta na série de posts sobre <em>Jenkins</em>, você pode conferir o primeiro post da série aqui -> <a href="http://rafaelchiavegatto.com.br/2016/02/17/deixando-o-jenkins-fazer-o-trabalho-manual-parte-1/">Deixando o Jenkins fazer o trabalho manual </a>. <br>
Neste post vamos executar nossos testes automatizados com o <em>Selenium</em> rodando no <em>Jenkins</em>.</p>

<p>O</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/03/19/deixando-o-jenkins-fazer-o-trabalho-manual-parte-2/</link><guid isPermaLink="false">712cfb13-d429-4cc9-ac4c-bc43d35aedf8</guid><category><![CDATA[jenkins]]></category><category><![CDATA[selenium]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Sat, 19 Mar 2016 01:55:35 GMT</pubDate><content:encoded><![CDATA[<p>Olá pessoal! Depois de alguns dias curtindo uma praia :) , aqui estamos de volta na série de posts sobre <em>Jenkins</em>, você pode conferir o primeiro post da série aqui -> <a href="http://rafaelchiavegatto.com.br/2016/02/17/deixando-o-jenkins-fazer-o-trabalho-manual-parte-1/">Deixando o Jenkins fazer o trabalho manual </a>. <br>
Neste post vamos executar nossos testes automatizados com o <em>Selenium</em> rodando no <em>Jenkins</em>.</p>

<p>O exemplo no qual irei demonstrar a utilização do Selenium é bem simples, utilizarei o padrão <strong>Page Objects</strong> juntamente com <strong>Java</strong> e <strong>Maven</strong>.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-18-19-08-04.png" alt=""></p>

<p><strong>Exemplo:</strong>
Iremos lançar notas de um Aluno e verificar se o mesmo foi <em>Aprovado</em>, <em>Reprovado</em> ou está em <em>Prova final</em>.</p>

<h6 id="vamoscomearaconfigurarnossostestes">Vamos começar a configurar nossos testes:</h6>

<p>Criaremos um <em>projeto Maven</em> e configuraremos o <em>pom.xml</em>.  </p>

<script src="https://gist.github.com/chiavegatto/02bee7c46a9958f19499.js"></script>

<p>Agora criaremos uma classe <em>WebDriverFactory.java</em> para criar novos drivers do Selenium, no exemplo vou utilizar apenas o Chrome.  </p>

<script src="https://gist.github.com/chiavegatto/bf886e1495915e6a6290.js"></script>

<p>Depois criaremos uma classe chamada de <em>BaseTestes.java</em>.  </p>

<script src="https://gist.github.com/chiavegatto/f6156b4ff37cbd2749c0.js"></script>

<p>Analisando a página para lançamento de notas, iremos criar a classe <em>PageLancamentoNotas.java</em>, mapeando os seguintes métodos para os testes da página.  </p>

<script src="https://gist.github.com/chiavegatto/0e2709a9f6c3d4c15308.js"></script>

<p>Agora implementaremos os métodos da nossa page.  </p>

<script src="https://gist.github.com/chiavegatto/3e9855c191e91420353a.js"></script>

<p>Agora é a hora de criar os testes.</p>

<script src="https://gist.github.com/chiavegatto/8bcc5f95929be0cd6b5e.js"></script>

<p>Neste momento estamos com todos os testes implementados, mas não colocamos nosso "best friend" Jenkins para fazer nosso trabalho manual, para isso, vamos configurar agora o nosso projeto no Jenkins.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-19-00-42-09.png" alt=""></p>

<p>Depois vamos configurar no Jenkins um repositório no <em>github</em> para fazer o clone e executar os testes. Lembre-se que no meu caso, a aplicação está executando localhost.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-19-00-48-38.png" alt=""></p>

<p>Feito essa configuração é só mandar executar o build.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-19-53-53.png" alt=""></p>

<p>Podemos configurar para mostrar o resultado dos testes no build. <br>
<img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-09-54.png" alt="">
Feito isto, teremos o resultado da execução dos testes.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-12-00.png" alt="">
Clicando sobre o <em>Test Result Trend</em>, iremos para uma tela onde mostra: <em>Pacote do projeto</em> > <em>Pacote de testes</em> > <em>Classe de teste</em> > <em>Execução dos testes</em>. <br>
<img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-12-05.png" alt="">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-12-23.png" alt="">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-12-27.png" alt="">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-25-20-12-31.png" alt=""></p>

<p>Espero que tenham gostado. No próximo post dando continuidade a série, iremos falar de testes mobile utilizando <em>Appium</em>. Até a próxima. Para conferir o <a href="https://github.com/chiavegatto/academico-teste">código completo do exemplo</a>.</p>]]></content:encoded></item><item><title><![CDATA[Vagrant e Docker - Como provisionar ambientes utilizando essas ferramentas]]></title><description><![CDATA[<p>Olá pessoal, tudo bem? Esses dias fui desafiado no <a href="http://agiletesters.com.br/topic/359/desafioagiletesters2016">#DesafioAgileTesters2016</a> a escrever um post sobre <a href="https://www.vagrantup.com/">Vagrant</a> e <a href="https://www.docker.com/">Docker</a>, por este motivo não escrevi a continuação da série dos posts sobre Jenkins. Por falar nisso você pode conferir o primeiro post da série <a href="http://rafaelchiavegatto.com.br/2016/02/17/deixando-o-jenkins-fazer-o-trabalho-manual-parte-1/">Deixando o Jenkins fazer o trabalho manual </a>, não</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/03/04/vagrant-docker-para-testers-quando-usar-um-ou-outro-ou-os-dois-o-que-um-faz-melhor-que-outro-quais-cenarios-que-o-testers-pode-utilizar/</link><guid isPermaLink="false">cf30bea5-7e22-468c-a2f5-6bf5092599a1</guid><category><![CDATA[docker]]></category><category><![CDATA[vagrant]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Fri, 04 Mar 2016 12:33:20 GMT</pubDate><content:encoded><![CDATA[<p>Olá pessoal, tudo bem? Esses dias fui desafiado no <a href="http://agiletesters.com.br/topic/359/desafioagiletesters2016">#DesafioAgileTesters2016</a> a escrever um post sobre <a href="https://www.vagrantup.com/">Vagrant</a> e <a href="https://www.docker.com/">Docker</a>, por este motivo não escrevi a continuação da série dos posts sobre Jenkins. Por falar nisso você pode conferir o primeiro post da série <a href="http://rafaelchiavegatto.com.br/2016/02/17/deixando-o-jenkins-fazer-o-trabalho-manual-parte-1/">Deixando o Jenkins fazer o trabalho manual </a>, não deixe de conferir e deixar seus comentários :). </p>

<p>Para não fugir do assunto da série, vamos voltar ao primeiro passo: Aprender a como provisionar (instalar/configurar) o Jenkins. Neste post aprenderemos a fazer este primeiro passo usando Vagrant e logo depois com Docker. </p>

<p>Quando comecei a utilizar ferramentas para provisionamento de ambientes, fazia muita confusão na utilização do Vagrant e Docker. Aprofundando os estudos vi que para criar uma imagem personalizada com Vagrant tinha que utilizar uma ferramenta de provisionamento e a que mais vi exemplos foi o <a href="https://puppetlabs.com/">Puppet</a>. Ao estudar Docker, pude observar que com um arquivo dockerfile eu teria uma ferramenta que faz tudo que o Vagrant e Puppet faz. A grosso modo, podemos dizer que sim, só que o Vagrant é a ferramenta para criar a "máquina", que pode utilizar vários provedores de máquinas virtuais (VMWare, VirtualBox entre outros) e para personalizar essa máquina, pode ser utilizada diversas ferramentas (Puppet, Docker, Ansible, Shell Script, Chef entre outras). </p>

<p>Minha primeira tentativa foi provisionar uma máquina utilizando shell script, bom funcionou! Mas manter o script de provisionamento com shell script não tem uma boa legibilidade, então vi que era possível provisionar com <a href="https://www.ansible.com/">Ansible</a> (esta ferramenta está no backlog de posts) e ficou muito mais simples manter o script de provisionamento. Agora vamos arregaçar as mangas e por a mão na massa e mostrar a diferença da utilização das ferramentas.   </p>

<h5 id="vagrant">Vagrant</h5>

<p>Executaremos a sequência de passos abaixo:</p>

<p>|Primeiro passo:</p>

<pre><code>vagrant init [box-name]
</code></pre>

<p>Para conseguir o nome dos box basta acessar a <a href="https://www.vagrantup.com/docs/boxes.html">URL</a>.</p>

<p>Irei mostrar o exemplo com o box <strong>ubuntu/trusty64</strong>. Comando que será executado: <br>
|vagrant init ubuntu/trusty64</p>

<p>Feito isso, será criado um arquivo <strong>Vagrantfile</strong> como mostra a imagem abaixo:</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-22-27-44.png" alt="">
Ao abrir o Vagrantfile, podemos observar que é adicionado o comando de configuração de qual box será utilizado para provisionar a máquina.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-22-34-38.png" alt=""></p>

<p>| Segundo passo:</p>

<p>Adicionar quanto de memória terá nossa máquina, isso mesmo, ao utilizar o Vagrant deixamos reservado uma quantidade fixa de memória.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-22-37-22.png" alt=""></p>

<p>| Terceiro passo:</p>

<p>Adicionar qual ferramenta será utilizada para fazer o provisionamento, neste exemplo, para deixá-lo mais simples irei utilizar shell script.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-22-39-24.png" alt="">
| Quarto passo:</p>

<p>Adicionar os comandos para provisionar, no nosso caso, os comandos para provisionar o Jenkins.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-22-58-29.png" alt=""></p>

<p>|Quinto passo:</p>

<p>Antes de executar o comando para provisionar a máquina, vamos adicionar alguns <strong>TLGs</strong> (Toques de leveza e graciosidade).</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-23-05-14.png" alt=""></p>

<p>Adicionei um nome para o host name, o nome da máquina no Virtual Box e adicionei a porta 8080 para fazer o bind e acessar o Jenkins como localhost:8080.</p>

<p>Agora vamos executar o comando para subir e provisionar a máquina com o Jenkins.</p>

<p>|vagrant up --provider virtualbox</p>

<p>Esta será a saída do resultado da execução do comando acima.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-23-10-04.png" alt=""></p>

<p>Feito isso temos nosso Jenkins provisionado pelo Vagrant.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-23-14-38.png" alt=""></p>

<h5 id="docker">Docker</h5>

<p>Agora para provisionar o Jenkins com o Docker seguiremos os passos abaixo:</p>

<p>| docker run -d --name jenkins-desafio -p 8082:8080 jenkins</p>

<p>Neste comando o container irá rodar em background utilizando o -d. A porta que será feito o bind com o container é a 8082.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/Captura-de-tela-de-2016-03-03-23-24-00.png" alt=""></p>

<p>Você deve está pensando: Com o Docker é muito mais simples! E eu lhe respondo que sim, mas apesar das ferramentas fazerem a mesma coisa, são utilizadas com propósitos diferentes. Podemos usá-las em conjunto, o Vagrant cria a máquina e a personalização fica por conta do Docker. A principal diferença nas ferramentas:</p>

<h6 id="docker">Docker</h6>

<ul>
<li>Compartilha os recursos da máquina (memória, disco e etc), mas não reservado;</li>
<li>Containers são mais leves, já que não precisam de um ambiente virtual completo;</li>
<li>Inicialização muito rápida.</li>
</ul>

<h6 id="vagrant">Vagrant</h6>

<ul>
<li>Traz todo o sistema operacional;</li>
<li>Traz usuários do sistema operacional;</li>
<li>Compartilha os recursos da máquina (memória, disco e etc), mas reservados, mesmo quando não utilizado.</li>
</ul>

<p><strong>Concluindo…</strong></p>

<p>Quando precisamos isolar nossa aplicação do sistema operacional, a melhor opção na minha opinião é utilizar o Vagrant. Caso contrário, usar Docker para provisionar sua aplicação antes de executar seus testes automatizados não faz mal a ninguém :). Espero que tenham gostado e não se esqueçam, seus comentários são sempre bem vindos, até breve!</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/2Kbjdri.png" alt=""></p>]]></content:encoded></item><item><title><![CDATA[Deixando o Jenkins fazer o trabalho manual - Parte 1]]></title><description><![CDATA[<p>Olá pessoal, tudo bem? :) <br>
Este é o primeiro post de uma série falando um pouco sobre Jenkins. No dia 24/06/2016 estarei no <a href="http://scrumrio.com/">Scrum Gathering</a> falando sobre este tema, por isso resolvi abordar alguns posts sobre o assunto. <br>
Testes de performance muitas vezes são negligenciados, porém são testes muito</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/02/17/deixando-o-jenkins-fazer-o-trabalho-manual-parte-1/</link><guid isPermaLink="false">9d855061-367a-49f3-85cb-63037d8e93c9</guid><category><![CDATA[jenkins]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Wed, 17 Feb 2016 23:11:00 GMT</pubDate><content:encoded><![CDATA[<p>Olá pessoal, tudo bem? :) <br>
Este é o primeiro post de uma série falando um pouco sobre Jenkins. No dia 24/06/2016 estarei no <a href="http://scrumrio.com/">Scrum Gathering</a> falando sobre este tema, por isso resolvi abordar alguns posts sobre o assunto. <br>
Testes de performance muitas vezes são negligenciados, porém são testes muito importantes, por isso vamos aprender como executar estes testes no Jenkins. </p>

<p>Vamos dividir em passos:</p>

<blockquote>
  <p>Primeiro passo:</p>
</blockquote>

<p>Criaremos nossas requisições para a execução do teste de performance. Para a utilização, vou mostrar um simples exemplo em uma API chamada "Academico", que foi desenvolvida por mim e com ajuda de um membro do meu time: Diego Coronel :). Essa API é bem simples: Cadastra alunos, Disciplinas, Professores, Realiza matrícula de alunos e Atribui professor para as disciplinas. Vamos por a mão na massa.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-21-30-10.png" alt="Definição das requisições"></p>

<p>Criamos uma requisição simples, passando um objeto que contém Nome, Carga Horária, Horário e Período da disciplina. Adicionamos um Gerenciador de cabeçalho "http" para adicionar o Content-Type: application/json.  </p>

<blockquote>
  <p>Segundo passo:</p>
</blockquote>

<p>Criaremos as demais requisições e adicionamos ouvintes(relatórios) e asserts para verificar o status da requisição e o retorno da requisição.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-22-02-28.png" alt="Adicionando mais requisições">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-22-02-28-1.png" alt="Adicionando mais requisições"></p>

<blockquote>
  <p>Terceiro passo:</p>
</blockquote>

<p>Agora adicionamos a quantidade de usuários virtuais e o tempo de intervalo entre cada requisição. Definir nesse momento um valor qualquer, pois como é uma API simples e para testes, não tenho requisitos não funcionais :).</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-22-05-52.png" alt="Definindo uma quantidade de usuários virtuais"></p>

<blockquote>
  <p>Quarto passo:</p>
</blockquote>

<p>Agora chegamos na parte em que executamos os testes de performance e coletamos os resultados.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-21-55-23.png" alt="Execução dos testes"></p>

<p>Até esse momento fizemos um passo a passo simples para executar os testes de performance em uma API, porém foram feitas várias alterações na API para adicionar a parte do histórico do aluno para lançar notas e verificar se o aluno está aprovado, reprovado ou em prova final. <br>
Preciso rodar os testes de performance mais uma vez, manual. E se ao invés de rodar os testes de forma manual, colocássemos o Jenkins para fazer esse trabalho? <br>
Vamos ver como colocar o nosso amigo Jenkins para fazer esse trabalho.</p>

<blockquote>
  <p>Primeiro passo é adicionar o plugin performance</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-22-19-16.png" alt="Add plugin performance"></p>

<blockquote>
  <p>Depois de instalarmos o plugin criaremos um novo projeto no Jenkins.</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-15-22-38-54.png" alt="Tela configuração jenkins"></p>

<p>Criaremos um projeto freestyle, e adicionaremos as configurações para a execução dos testes de performance pelo Jenkins.</p>

<blockquote>
  <p>Iremos configurar agora os testes para ser executado pelo Jenkins.</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-15-08.png" alt="Tela configuração jenkins"></p>

<p>Configuramos o caminho de onde está o JMeter e o nosso arquivo .jmx (criado na suíte do JMeter). </p>

<p>Definimos onde está o arquivo .jtl (resultado de execução dos testes do JMeter)</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-15-15.png" alt="Resultado execucao"></p>

<p>Precisamos definir limites de erros para nosso build falhar ou ficar instável. No exemplo coloquei -1, ou seja qualquer erro que apresentar nos testes o build irá falhar.</p>

<blockquote>
  <p>Executar o build do projeto</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-20-27.png" alt="Logs jenkins">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-20-07.png" alt="Projeto com os testes de performance"></p>

<p>Podemos observar os gráficos ao abrir o projeto no Jenkins, neste exemplo, não temos nenhum erro nas requisições. Podemos ver melhor os gráficos clicando sobre eles.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-23-51.png" alt="Gráficos"></p>

<p>Nesses gráficos é possível observar que o "Adicionar Alunos" está com o tempo de resposta de 200ms. A cada build gerado no Jenkins é possível verificar esses gráficos de performance do projeto.</p>

<blockquote>
  <p>Agora podemos agendar a execução dos testes:</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/02/Captura-de-tela-de-2016-02-16-23-35-45.png" alt="Agendamento jenkins"></p>

<p>Os testes serão executados todos os dias às 22:30, essa foi a configuração definida, mas é possível fazer outras configurações como por exemplo:</p>

<pre><code># todo minuto
* * * * *
# no minuto 5 de cada hora (ou seja '2:05,3:05,...') 
5 * * * *
</code></pre>

<p>Espero que tenham gostado do post, como vimos é simples colocar o nosso amigo Jenkins para fazer o trabalho manual. Até o próximo post onde falarei sobre a execução de testes web com o Selenium no Jenkins.</p>]]></content:encoded></item><item><title><![CDATA[Docker - Algumas coisas que podem ser feitas além do "Hello world"]]></title><description><![CDATA[<p>Oi pessoal!:) Quero começar este post agradecendo mais uma vez por estarem prestigiando o conteúdo do blog. Esta é uma pequena iniciativa para disseminar conhecimento, trocar experiências e também aprender com vocês, então vamos seguir! </p>

<p>A ideia deste post é falar um pouco mais de <a href="https://www.docker.com/">Docker</a> e algumas coisas que</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/01/29/docker-algumas-coisas-alem-do-que-rodar-apenas-servicos/</link><guid isPermaLink="false">c6c79c0a-e3c3-4144-8c78-391f2cba5b13</guid><category><![CDATA[docker]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Fri, 29 Jan 2016 04:11:00 GMT</pubDate><content:encoded><![CDATA[<p>Oi pessoal!:) Quero começar este post agradecendo mais uma vez por estarem prestigiando o conteúdo do blog. Esta é uma pequena iniciativa para disseminar conhecimento, trocar experiências e também aprender com vocês, então vamos seguir! </p>

<p>A ideia deste post é falar um pouco mais de <a href="https://www.docker.com/">Docker</a> e algumas coisas que podem ser feitas além do "hello world". <br>
Quando comecei a usar Docker apenas tinha em mente ter uma aplicação rodando em background e pronto, tela preta e um serviço rodando (postgres, wildfly e outros). Descobrir que Docker vai além disso é muito interessante e instigante, dá para fazer muitas coisas bem legais. <br>
Esses dias queria fazer uma api em php utilizando o <a href="http://www.slimframework.com/">Slim Framework</a>, porém tinha que instalar todo o ambiente na minha máquina para desenvolvê-la. Será que isso vale a pena, quando somente pretende-se "brincar" com um framework? Bom, acredito que não, então o que fiz:</p>

<pre><code>web:
  image: tutum/apache-php
  hostname: web
  links:
   - mysql
  ports:
   - 80:80
  volumes:
   - .:/app

mysql:
  image: mysql
  hostname: mysql
  environment:
   - MYSQL_ROOT_PASSWORD=root 
</code></pre>

<blockquote>
  <p>Nessa parte é feito o link do container apache-php com o container do mysql.</p>
</blockquote>

<pre><code>links:
 - mysql
</code></pre>

<blockquote>
  <p>Aqui está sendo feito a parte mais importante desse docker-compose,</p>
</blockquote>

<pre><code>volumes:
 - .:/app
</code></pre>

<p>Esse volume basicamente serve para mapear um diretório no local onde está sendo executado o docker-compose com a pasta app do container. Ao criar um arquivo nessa pasta, será adicionado ao apache, com isso não é preciso configurar todo o ambiente do php para conseguir "brincar" com o Slim Framework, isso possibilita fazer inúmeras coisas como:  compartilhar entre a máquina e o container, .jar, .war, .js, .html e etc. <br>
Outra funcionalidade muito importante do volume é fazer backup de dados, como por exemplo: criar um volume com o banco de dados do postgres e toda vez que subir um container do postgres, apontar para o volume criado, com isso não seria perdido os dados do banco de dados, às vezes isso é bem útil, ainda mais quando utilizado docker em produção :).</p>

<p>Mas você deve está se perguntando: - Ainda é uma interface preta que está apenas rodando um serviço! Então vamos ver uma coisa legal :).</p>

<p>E se agora eu não tivesse mais interesse em instalar o Google chrome na minha máquina, então bastaria executar o seguinte comando:</p>

<pre><code>docker run -it --net host --cpuset-cpus 0  -m 512mb -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v /dev/snd:/dev/snd --privileged --name chrome jess/chrome
</code></pre>

<blockquote>
  <p>E com isso temos:</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-28-23-20-54.png" alt="docker-chrome">
<img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-28-23-21-22.png" alt="docker-chrome"></p>

<p>É possível compartilhar placa de som, USB e etc com um container, isso possibilita fazer muitas coisas, por exemplo: não precisar instalar o ambiente do Android na máquina, para executar testes em app Android, mas isso fica para um próximo post! Até breve.</p>]]></content:encoded></item><item><title><![CDATA[Criação de um grid com Selenium utilizando Docker]]></title><description><![CDATA[<p>A ideia deste post é mostrar as facilidades para criar um grid utilizando <a href="https://www.docker.com/">Docker</a>. Nesse momento eu pergunto a você leitor: Já tentou criar um grid utilizando Selenium? Se a resposta for sim, você deve lembrar que não é uma atividade simples, uma vez que você terá que subir o</p>]]></description><link>https://rafaelchiavegatto.com.br/2016/01/11/criacao-de-um-grid-com-selenium-utilizando-docker/</link><guid isPermaLink="false">de9c288c-39c3-402d-9e7a-8fb32eb3f64d</guid><category><![CDATA[grid]]></category><category><![CDATA[docker]]></category><category><![CDATA[selenium]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Mon, 11 Jan 2016 13:44:23 GMT</pubDate><content:encoded><![CDATA[<p>A ideia deste post é mostrar as facilidades para criar um grid utilizando <a href="https://www.docker.com/">Docker</a>. Nesse momento eu pergunto a você leitor: Já tentou criar um grid utilizando Selenium? Se a resposta for sim, você deve lembrar que não é uma atividade simples, uma vez que você terá que subir o hub e seus nodes, sendo que todo novo node é necessário registrar no grid e etc. Abaixo segue exemplo de como utilizar o grid na forma tradicional.</p>

<blockquote>
  <p>Para subir o grid:</p>
</blockquote>

<pre><code>java -jar selenium-server-standalone-2.48.2.jar -role hub
</code></pre>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-09-19-11-14.png" alt="Imagem grid"></p>

<blockquote>
  <p>Para subir o node:</p>
</blockquote>

<pre><code>java -jar selenium-server-standalone-2.48.2.jar -role node  -hub http://localhost:4444/grid/register
</code></pre>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-09-19-13-08.png" alt="Imagem grid com nodes"></p>

<p>É possível fazer isso de forma mais simples utilizando Docker. A própria comunidade do Selenium mantém as images Docker com o hub, Firefox e Chrome nodes. Vamos começar a criar nosso grid utilizando Docker.</p>

<blockquote>
  <p>Subindo nosso hub:</p>
</blockquote>

<pre><code>$ docker run -d -P --name selenium-hub selenium/hub:2.48.2
</code></pre>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-11-22-42-50.png" alt="Imagem grid"></p>

<blockquote>
  <p>Subindo nossos nodes:</p>
</blockquote>

<pre><code>  $ docker run -d --link selenium-hub:hub selenium/node-chrome:2.48.2
  $ docker run -d --link selenium-hub:hub selenium/node-firefox:2.48.2
</code></pre>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-11-22-43-51.png" alt="Imagem grid"></p>

<p>Agora se precisarmos criar outros nodes, precisaríamos criar novos containers:</p>

<pre><code>  $ docker run -d --link selenium-hub:hub selenium/node-firefox:2.48.2
</code></pre>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-11-22-47-54.png" alt="Imagem grid"></p>

<p>O trabalho ainda está bem manual. É possível deixar este processo ainda mais simples utilizando o docker-compose. Abaixo exemplo do docker-compose para criar nosso grid.</p>

<blockquote>
  <p>Criando o grid com docker-compose:</p>
</blockquote>

<pre><code>hub:
  image: selenium/hub:2.48.2
  hostname: selenium-hub
  ports:
   - 4444:4444

chrome:
  image: selenium/node-chrome:2.48.2
  links:
   - hub

firefox:
  image: selenium/node-firefox:2.48.2
  links:
   - hub
</code></pre>

<p>Basta executar o comando:  </p>

<blockquote>
  <p>docker-compose up -d</p>
</blockquote>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-11-22-50-26.png" alt="Imagem grid"></p>

<p>Para criar novos nodes execute o comando:  </p>

<blockquote>
  <p>docker-compose scale hub=1 chrome=3 firefox=3 </p>
</blockquote>

<p>Colocando a quantidade desejada para cada node.</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/01/Captura-de-tela-de-2016-01-11-22-52-31.png" alt="Imagem grid"></p>]]></content:encoded></item><item><title><![CDATA[Como deixar seus casos de testes vivos]]></title><description><![CDATA[<p>A grande maioria das pessoas que estão lendo este post já devem ter passado pela situação de ter uma suíte de testes no Testlink que praticamente “não serve mais”, o motivo dessa não serventia deve-se ao dia-a-dia dinâmico de desenvolvimento de software. As alterações nos requisitos do sistema podem ocorrer</p>]]></description><link>https://rafaelchiavegatto.com.br/2015/11/16/como-deixar-seus-casos-de-testes-vivos/</link><guid isPermaLink="false">e0fcf7ba-6879-4243-b8cb-27232e9e3ce0</guid><category><![CDATA[bdd]]></category><category><![CDATA[cucumber]]></category><dc:creator><![CDATA[Rafael Chiavegatto]]></dc:creator><pubDate>Mon, 16 Nov 2015 16:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A grande maioria das pessoas que estão lendo este post já devem ter passado pela situação de ter uma suíte de testes no Testlink que praticamente “não serve mais”, o motivo dessa não serventia deve-se ao dia-a-dia dinâmico de desenvolvimento de software. As alterações nos requisitos do sistema podem ocorrer a qualquer momento e devido a priorização de tarefas, os casos de testes acabam ficando desatualizados.</p>

<p>A proposta deste post é mostrar como a utilização de especificação de cenários em features utilizando a técnica de BDD, pode deixar nossos casos de testes “vivos”, para conseguir mantê-los atualizados com mais facilidade.</p>

<p>A proposta é escrever um caso de testes no seguinte formato:</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/sem-tc3adtulo.png" alt=""></p>

<p>Mas você deve está se perguntando: Vou transformar BDD em casos de testes?</p>

<p>A proposta é: Transformar os casos de testes automatizáveis em cenários e não fazer de uma feature um amontoado de "casos de testes", com milhares de combinações. O que eu quero dizer com isto é:</p>

<p>Se tenho a seguinte tela:</p>

<p><label for="login">Login:</label> <br>
<input type="text" placeholder=""> <br>
<label for="Senha">Senha:</label> <br>
<input type="text" placeholder=""> <br>
<input type="submit" value="Login"></p>

<p>Não vou fazer os cenários:</p>

<ul>
<li>Logar na aplicação;</li>
<li>Nome de usuário inválido;</li>
<li>Senha de usuário inválida;</li>
<li>Deixar campo “Nome” e “Senha” em branco;</li>
<li>Colocar caracteres especiais nos campos “Nome” e “Senha”;
Etc.</li>
</ul>

<p>Se terei uma funcionalidade “Cadastrar pessoa” e para cadastrar uma pessoa terei que logar na aplicação, então não preciso ficar fazendo milhares de combinações na Tela de login, afinal, isso não vai gerar valor de negócio ao cliente, ninguém desenvolve somente uma Tela de login para um cliente.</p>

<p>Agora vendo o cenário abaixo:</p>

<p><img src="https://rafaelchiavegatto.com.br/content/images/2016/03/sem-tc3adtulo1.jpg" alt=""></p>

<p>Qual ganho teríamos colocando os casos de testes em features ao invés de criá-los no Testlink?</p>

<p>Ao optar por escrever um cenário em uma feature este deve ser automatizado, caso não seja, praticamente não terá ganho algum em relação aos casos de testes criados no Testlink. Ao adicionar esses cenários automatizados no pipeline do servidor de integração contínua, toda vez que seus testes falharem, eles irão impedir a geração de uma nova release e com isso <strong>obrigatoriamente</strong> os cenários terão que ser atualizados. Vale lembrar que a automação dos cenários de uma feature deve utilizar boas práticas de desenvolvimento, nada de:</p>

<p>Thread.sleep(1000);</p>

<p>Afinal, se seu teste por algum motivo demorar 2 segundos, não quer dizer que sua funcionalidade quebrou, pode ser um indicador que seus testes talvez não estejam bons. Em um outro momento, farei um outro post relacionado a como configurar o ambiente e como executar os testes no servidor de integração contínua.</p>]]></content:encoded></item></channel></rss>