Pesquisar este blog

terça-feira, 11 de agosto de 2015

Python vs Java na Automação de Testes


   A muito tempo quero fazer uma comparação entre Python e Java para automação de testes. Vejo que a maioria dos treinamento são em Java para automação de testes. No entanto as outras linguagens são esquecidas como Python principalmente, é pouco falado e disseminado entre as empresas, sendo que Python é muito mais rápido a linha de aprendizado que Java.  No entanto o aprendizado em Java leva muito mais tempo e treinamento. 
   Vamos falar do ponto mais importante que é produtividade.  Fiz um pequeno teste usando a própria ferramenta do Selenium IDE pra medir a produtividade, medindo pela quantidade de linhas de código gerada pela própria ferramenta, exportando para as devidas linguagem.

Passo 01: 
Foram gravado os seguintes passos:
1. Abrir o google;
2. Pesquisar pelo assunto "Amazon";
3. Selecionar o Link e em seguida pesquisar pelo assunto "Python";
4. Selecionar o livro "Use a Cabeça! Python";
5. Clicar no botão "adicione ao carrinho".

Passo 02:
Agora vamos exportar o script gerado, seguindo as opções "Arquivo - Exportar Teste como..."
Vamos exportar com as opções abaixo:
 Python 2 / unittest / WebDriver
Java / Unit 4 / WebDriver

Passo 03:
Agora vamos abrir com o notepad++ e avaliar a quantidade de linhas de código:
Python - 55 Linhas - 2133 Caracteres
Java - 77 Linhas - 2233 Caracteres

Analisando o código gerado a ferramenta criou o método main do python pra fazer a chamada da classe e no java ela não fez isso, fazendo o mesmo a quantidade de linhas no java ia ser bem maior.

if __name__ == "__main__":
    unittest.main()


Quantidade de imports, vemos que no Python temos 7 linhas de import e no java temos 8 linhas.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re


Otimizado um pouco o nosso código ficaria com 3 linhas e funcionaria de boa, não sendo necessário as outras:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, NoAlertPresentException
import unittest, time, re

No Python não precisamos colocar ; no final das variáveis, pelo que contei no código em java tivemos 38 ponto e vírgula, isso é desvantagem, sem falar dos parentheses. Uma característica marcada no Python é a identação do código é obrigatório que o código esteja alinhado de forma correta, isso facilita muito a manutenção do código, se torna fácil de entender a lógica e os loops, no caso do java a ferramenta fez a organização do código, mas não é assim que os desenvolvedores fazem, dificilmente você vai encontrar um código bem arrumado.

No código abaixo não sei porque a ferramenta criou driver = self.driver, podemos muito bem usar direto self.driver em todas as linhas, não precisando criar driver = self.driver, removemos com isso mais uma linha ficando com 50 linhas / 1970 Caracteres do nosso código, contra 77 linhas / 2233 Caracteres do java, aqui vemos 263 Caracteres que em python podemos ser mais produtivo que em Java. 
   É claro que é meio difícil medir a produtividade, simplesmente porque cada pessoa tem a sua velocidade e existe a IDEs como Eclipse e Pycharm que tem o code completion, Java é uma linguagem muito poderosa, mas na automação de testes não utilizamos nem 30% dela, no entanto Java é muito mais verboso e tem um tempo maior de aprendizado que Python. No meu caso, eu codifico scripts de testes em Python, posso dizer que é muito prático e rápido de codificar, no Python você pode usar o extend em mais de uma classe, no Java você não consegue isso, mas existe outras formas pra contornar em java, mas não de forma prática como no Python.
 


Código em Python:
# -*- coding: utf-8 -*-from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, NoAlertPresentException
import unittest, time, re

class SeliniumPython(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.com.br/"        self.verificationErrors = []
        self.accept_next_alert = True        def test_selinium_python(self):
        self.driver.get(self.base_url + "/search?q=amazon&ie=utf-8&oe=utf-8&gws_rd=cr&ei=2JXKVZSXDMKXgwSSnLWYAw")
        self.driver.find_element_by_link_text("Amazon.com.br: compre livros, eBooks, e-readers Kindle e ...").click()
        self.driver.find_element_by_id("twotabsearchtextbox").click()
        self.driver.find_element_by_id("twotabsearchtextbox").clear()
        self.driver.find_element_by_id("twotabsearchtextbox").send_keys("python")
        self.driver.find_element_by_css_selector("input.nav-input").click()
        self.driver.find_element_by_xpath("//li[@id='result_3']/div/div/div/div[2]/div/a/h2").click()
        self.driver.find_element_by_id("bb_atc_button").click()
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False 
        return True    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Código em Java:
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class SeleniumJava {
  private WebDriver driver;
  private String baseUrl;
  private boolean acceptNextAlert = true;
  private StringBuffer verificationErrors = new StringBuffer();

  @Before
  public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "https://www.google.com.br/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  }

  @Test
  public void testSeleniumJava() throws Exception {
    driver.get(baseUrl + "/search?q=amazon&ie=utf-8&oe=utf-8&gws_rd=cr&ei=2JXKVZSXDMKXgwSSnLWYAw");
    driver.findElement(By.linkText("Amazon.com.br: compre livros, eBooks, e-readers Kindle e ...")).click();
    driver.findElement(By.id("twotabsearchtextbox")).click();
    driver.findElement(By.id("twotabsearchtextbox")).clear();
    driver.findElement(By.id("twotabsearchtextbox")).sendKeys("python");
    driver.findElement(By.cssSelector("input.nav-input")).click();
    driver.findElement(By.xpath("//li[@id='result_3']/div/div/div/div[2]/div/a/h2")).click();
    driver.findElement(By.id("bb_atc_button")).click();
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }

  private boolean isElementPresent(By by) {
    try {
      driver.findElement(by);
      return true;
    } catch (NoSuchElementException e) {
      return false;
    }
  }

  private boolean isAlertPresent() {
    try {
      driver.switchTo().alert();
      return true;
      catch (NoAlertPresentException e)
      return false;
    
  }

  private String closeAlertAndGetItsText() {
    try {
      Alert alert = driver.switchTo().alert();
      String alertText = alert.getText();
      if (acceptNextAlert) {
        alert.accept();
      } else {
        alert.dismiss();
      }
      return alertText;
    } finally {
      acceptNextAlert = true;
    }
  }
}

sábado, 8 de agosto de 2015

Criando uma classe Email para Report de problemas nos Testes.


   É muito útil você receber um Relatório mostrando o momento exato que aconteceu o problema/bug nos testes automatizados, para isso vamos fazer uma classe email, enviando para a mesma os parâmetros que desejamos receber, num eventual teste de estresse é essencial saber a duração, o tempo que durou a aplicação em um determinado teste de estresse/carga, para constar em nosso relatório. Como somos fera, vamos criar em Python o código de envio de email, criando uma conexão SMTP (Simple Mail Transfer Protocol) client session, o que quer dizer isso, bom vamos criar uma conta do google e ele  vai retransmitir mensagens enviadas para o nosso destinatário. 
   O legal de enviar um email de erro, você pode receber no celular é você não precisar checar o tempo todo os seus testes e nem parar todos os testes automatizados por causa de um erro.

Para mais detalhes leia a página abaixo:
SMTP Google


# -*- coding: utf-8 -*-
"""
Autor: Reinaldo M. R. J
Data: 08-08-2015
Desc: Classe para enviar o report dos testes.
"""
from utils.common import *
# Import the email modules we'll need
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email.mime.image import MIMEImage
# Import smtplib for the actual sending function
import smtplib
import os


class test_Report:

    def __init__(self):
        self.common = FunctionsVariables()

    def email_file(self,path_full, file_name):

        try:
            # Create the container (outer) email message.
            msg = MIMEMultipart()
            # In SUBJECT
            SUBJECT = "Report of Sanity Test"
            msg['Subject'] = SUBJECT
            msg['From'] = "xxxx@gmail.com"
            # Aqui vai conter nosso destinatario.
            msg['To'] = "reinaldo.rossetti@outlook.com"
            msg['Date'] = formatdate(localtime = True)
            # No MIMEText vamos digitar o que vai conter no corpo do email.
            msg.attach(MIMEText('Sanity teste finalizado com Sucesso.,'
                                 ' Verifique o resultado em anexo.'))

            part = MIMEBase('application', "octet-stream")
            part.set_payload(open(path_full, "rb").read())
            Encoders.encode_base64(part)
            part.add_header('Content-Disposition', 'attachment; filename='\
                            + file_name)
            msg.attach(part)
            # Configuração do smtp do gmail e porta.
            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.ehlo()
            server.starttls()
            server.login(msg['From'], 'digite a senha aqui')
            try:
                # Python 3.2.1
                server.send_message(msg)
            except AttributeError:
                # Python 2.7.2
                server.sendmail(msg['From'], [msg['To']], msg.as_string())
                print "Enviado com Sucesso!"
            finally:
                server.quit()
        except (RuntimeError, TypeError, NameError):
                print "Unexpected error:", sys.exc_info()[0]
                raise

    def SendEmailFalha (self, testCaseNumber, testCaseName, \
                        duration, result, path_full, img_name):

        try:
            # Create the container (outer) email message.
            msg = MIMEMultipart()
            destination = ("reinaldo.rossetti@outlook.com", "reiload@gmail.com")
            text = ("Number of Test: " + str(testCaseNumber) + " Result: "\
                    + str(result) + "\nTest Device: " + testCaseName \
                    + "\nDuration DAYS:HOURS:MIN: " + str(duration))

            msg['Subject'] = "Status dos Testes - " + str(testCaseName) +\
                             " Result: " + str(result)
            msg['From'] = "xxxx@gmail.com"
            msg['To'] = ','.join(destination)
            texto = MIMEText(text, 'plain')

            file = path_full
            fp = open(file, 'rb')
            img = MIMEImage(fp.read())
            fp.close()
            img.add_header('Content-Disposition', 'attachment',
                           filename=img_name)
            msg.attach(texto)
            msg.attach(img)

            # Send the email via our own SMTP server.
            s = smtplib.SMTP('smtp.gmail.com', 587)
            s.ehlo()
            s.starttls()
            s.login(msg['From'], 'digite aqui sua senha')

            try:
                # Python 3.2.1
                s.send_message(msg)
            except AttributeError:
                # Python 2.7.2
                s.sendmail(msg['From'], [msg['To']], msg.as_string())
                print "Enviado com Sucesso!"
            finally:
                s.quit()
        except (RuntimeError, TypeError, NameError):
                print "Unexpected error:", sys.exc_info()[0]
                pass

if __name__ == '__main__':
    test = test_Report()
    test.SendEmailFalha("Test-333", "Stress TestX", "00:12:00",
                        "False","D:\Minhas imagens\conferirCONCD006.png", "conferirCONCD006.png")



No nosso código foi incluído um try e um except com pass, isso quer disser se tivemos algum erro, ele vai mostrar o error e vai passar na função não parando o código em eventual erro, outra coisa interessante do nosso código é a versão do Python 2.7.x e 3.x as funções são diferentes, dessa forma feita não vai dar problema com as diferentes versões. Outra boa prática séria usar remover variáveis que podem mudar no nosso código, como os email do Destinatário, podemos colocar todas essas variáveis em FunctionsVariables, e apagamos a linha em nosso código, naquele momento do aperreio temos um única classe com todas as variáveis que podem mudar.

Exemplo in functions_variables.py
class functionsVariables(object):
   global destination
   destination = ("reinaldo.rossetti@outlook.com", "reiload@gmail.com")

O Nosso Resultado Final é esse abaixo:


sábado, 1 de agosto de 2015

Criando um Bom Plano de Teste


   Na Engenharia de Testes na fase de Planejamento devemos criar um Plano de Testes conciso e eficaz, adotando a metodologia ágil. O que isso quer dizer?, deve conter no documento aquilo que realmente tem valor para as pessoas interessadas no projeto. Não adianta escrever um documento de 50 páginas aonde ninguém vai ler ou dar valor.
   O plano de testes funciona como um contrato entre os times envolvidos, então deve ser claro e conciso e ao mesmo tempo venha trazer eficácia para o time de testes. Para isso você precisa entender os Artefatos/Documentos gerados no desenvolvimento do sistema, segue os principais abaixo:

• Artefatos de Entrada:

– Plano do projeto ;
– Requisitos funcionais e não-funcionais ;
– Documentação referente aos projetos/sistemas relacionados.



Agora vamos falar de Boas Práticas:
  • Sempre usar ferramentas para Gestão dos Testes e Bug Tracker (TestLink, JIRA, TestRail, Mantis, Bugzilla, etc);
  • Envolver os profissionais de testes desde a elicitação inicial dos requisitos do software (workshops);
  • Definir uma estratégia para priorização dos testes com foco no negócio do software (priorizar requisitos mais importantes);
  • Descrever bem o que a área de Testes vai fazer e não vai fazer;
  • Descrever bem os Critérios de Suspensão da versão.
  • É algo fundamental colocar as Premissas e Acordos entre as áreas envolvidas, um exemplo seria: 
"Fica acordado que o analista de Sistemas/Negócio que conhece bem do sistema e ou arquiteto do projeto deverão prestar consultoria em pelo menos 1h diária, para a equipe de testes em casos de dúvidas geradas na revisão dos documentos, e na criação do Plano de Teste como também na criação do Ambiente para a realização dos Testes."
    • Outra coisa muito importante é não esquecer de criar um Plano de Testes que contém os requisitos não funcionais do projeto, como Testes de Segurança e Performance, problema aqui põem todo projeto a perder.
      Na minha Pós-graduação em testes de Software o professor pediu para fazer um plano de testes e criar o desenho do sistema. De acordo com professor está de Acordo com o esperado de  um bom  plano de testes, seguindo o que ele faz no Instituto CESAR de Curitiba.

      Existe outra forma de fazer um Plano de Teste, Planos de Testes por Iteração, são Planos de Testes enxutos pra cada Iteração do Projeto.

      Segue um exemplo do que seria um Plano de Teste em 18 páginas, coloquei referências bibliográficas para melhor aprofundamento no assunto, não sendo necessário colocar no plano de testes:
      Plano de Testes - LINK

      https://en.wikipedia.org/wiki/Test_plan

      domingo, 19 de julho de 2015

      Jenkins + Python + Robot Framework Parte 2


      Depois de Configurar o Python e o Robot Framework vamos Instalar e configurar  o Jenkins, antes disso vamos criar uma conta no Bitbucket, segue o link abaixo:
       https://bitbucket.org/

      Agora vamos instalar o jenkins, segue o link abaixo e instale a versão de acordo com o seu sistema operacional.

      https://jenkins-ci.org/#stable


      Versões suportadas


      Você pode iniciar o jenkins de forma manual com o seguinte comando:
      java -jar jenkins.war
       
      No Windows ele vai iniciar o processo junto com o sistema operacional, então precisamos 
      somente digitar no browser http://localhost:8080/ , geralmente nos servidores a porta 8080
      é muito utilizada, caso você queira mudar de portar inicie ele com outra porta,
      segue o comando:
       
      java -jar jenkins.war  --httpPort=<numero da porta>
      
      
      antes de iniciar o servidor, precisamos para o serviço:
      net stop jenkins
      
      
      para mais configurações segue o link abaixo:
      https://wiki.jenkins-ci.org/display/JENKINS/Starting+and+Accessing+Jenkins


      Agora vamos instalar o Plugins necessário para realizar nosso teste, siga o caminho abaixo
      •  Gerenciar Jenkins - Gerenciar Plugins



      Agora ele vai mostrar a tela de Plugins com as seguintes opções Atualizações, Disponíveis, Instalados e Avançado. Seleciona a aba Disponíveis.

      • GIT plugin, Robot Framework plugin, SCM API Plugin, Selenium HTML report, Selenium Plugin.

      Agora confirme a instalação, e o jenkins vai iniciar o processo de instalação.

      No Windows após a instalação reinicie a maquina.


      Agora vamos configurar nosso teste, antes disso vamos instalar o GIT cliente para Windows.
      https://git-scm.com/download/win
      No linux use o comando abaixo:
      sudo apt-get install git

       Segue um tutorial básico do GIT:
      http://rogerdudler.github.io/git-guide/index.pt_BR.html

      Agora vamos começar nosso build automatizado, a gente vai utilizar nosso WebDemo
      da primeira postagem, dessa vez a gente vai fazer tudo remoto.

      Selecione os Passos 1. Novo job - 2. Construir projeto de múltiplas configurações - 3. OK


      ** Não esqueça de colocar um nome ao seu Job/Projeto.

      Vamos Primeiramente configurar o GIT:
      Selecione as opção 1. GIT 2.  Adicione o caminho do sistema "https://reiload@bitbucket.org/robotframework/webdemo.git" 3. Adicione as credenciais seu login e senha criado no bitbucket.org.




      Caso der o erro: Failed to connect to repository : Could not init C:\Windows\TEMP\hudson862793913918641728tmp, precisamos passar o caminho do GIT instalado para o Jenkins, o caminho padrão no windows é "C:\Program Files (x86)\Git\bin" , você adiciona em Gerenciar Jenkins - Configurar o sistema - Git installations - Path to Git executable:


      Agora ao voltar para o menu o erro não mais vai aparecer.


      Em Trigger de builds, vamos fazer ele consultar periodicamente se houve mudança no servidor, selecione a opção: Consultar periodicamente o SCM, e adicione "*H/5 * * * *" aqui ele vai consultar a cada 5 minutos se houve uma modificação ele vai rodar o build novamente.
      No campo Build, vamos adicionar o comando para executar os nossos testes, selecione a opção "Executar no comando windows"

      Em Matriz de configuração adicione Rodar cada configuração em sequência, agora vá na opção Build, Clique a opção "Adicionar passo no build" em seguida selecione a opção "Executar shell" se você for executar no Linux e no windows você seleciona a opção "Executar no comando Windows".
      No campo texto adicione o comando:
      • pybot --variable BROWSER:Chrome login_tests
      Você pode adicionar outros clicando no menos comando novamente adicionando o texto abaixo:
      • pybot --variable BROWSER:IE login_tests
      • pybot --variable BROWSER:firefox login_tests


      Em seguida vamos adicionar uma ação após a realização do teste, no campo Ações de pós-build, clique no botão "Adicionar ação de pós-build", selecione a opção "Publish Robot Framework test results", vamos adicionar ao campo Thresholds for build result, como 50% e 100%, como mostra a figura abaixo:

       Após salva o nosso Job, vamos voltar para a tela inicial do Jenkins, em seguida vamos executar nossos testes, siga os passos Coloque o cursor do mouse em cima do nome do nosso projeto e em seguida clique na opção "Construir agora", automaticamente o Jenkins vai começar os testes em background, espere alguns minutos para termino do teste.



      Quando executei meus testes a primeira vez houve falha devido ao firewall bloquear o jenkins, adicione o jenkins no seu firewall do windows ou linux como permitido.


      Agora vamos melhorar nosso projeto adicionando Matriz de configuração, vai criar uma matriz dividida pelos Browsers que vamos usar firefox | chrome | IE , vamos adicionar o Eixo Definido pelo Usuário , no nome vamos adicionar o valor: BROWSER, no campo Valores vamos adicionar: firefox chrome IE.





      Em Matriz de configuração adicione Rodar cada configuração em sequência, agora vá na opção Build, Clique a opção "Adicionar passo no build" em seguida selecione a opção "Executar shell" se você for executar no Linux e no windows você seleciona a opção "Executar no comando Windows".
      No campo texto adicione o comando:
      pybot --variable BROWSER=$BROWSER login_tests
       
       
      Agora nosso projeto esta perfeito, esta mostrando todos os browsers, sendo executado 8 testes para cada Browser.

      Caso você não consiga realizar os passos segue um vídeo em english mostrando como se faz.
      https://vimeo.com/96527858

      sexta-feira, 3 de julho de 2015

      Jenkins + Python + Robot Framework


      A pouco tempo na Pós-graduação em Testes de Software, o professor passou um trabalho sobre Integração Continua e Build de Testes Automatizado, nesta postagem, fiz o exemplo prático do nosso trabalho, vamos instalar o Jenkins e rodar um teste automatizado em um repositório git nas nuvens, para isso vamos usar o Robot Framework, no entanto vamos fazer em Python como é uma linguagem simples e dinâmica as pessoas que nunca programaram vão aprender com facilidade.

       Apresentação em PDF:
      http://www.slideshare.net/reinaldorossetti/integrao-continua-e-b


      Primeiro passo precisamos instalar o Python no PC local/Servidor.

      1. Instalar o Python no Windows ou Linux:
      Baixe o Python no Site abaixo:
      https://www.python.org/downloads/

      Pelo linux você pode usar o comando:
      sudo apt-get install python3

      Qualquer dúvida na Instalação acesse o vídeo:
       ** Não esqueça de adicionar a opção "Add python.exe to Path" e depois da Instalação reinicie o computador.


      Segundo Passo vamos Instalar o Framework que vai rodar nos nossos testes.

      2. Instalar Robot Framework

      2.1 No linux vamos instalar o PIP no python pelo comando abaixo:
      apt-get update
      apt-get -y install python-pip

      No Windows fiz um passo a passo no link abaixo:
      http://reinaldorossetti.blogspot.com.br/2014/01/instalando-o-selenium-no-python-na.html


      2.2 Agora vamos instalar o Framework Robot

      Pelo Shell do Linux ou CMD do Windows podemos usar o comando abaixo:
      •     pip install robotframework

      Vamos também instalar robotframework e seleniumlibrary, segue o link abaixo para instalar a API, baixe o arquivo de acordo a versão do SO, Win32, AMD64, LINUX:
      https://code.google.com/p/robotframework-seleniumlibrary/downloads/list

      Pelo Shell do Linux ou CMD do Windows podemos usar o comando abaixo:
      •    pip install robotframework-selenium2library
      ** Caso não consiga instalar segue o vídeo para instalação no Linux:
      https://www.youtube.com/watch?v=vgvCMLNqeqQ

      3. Neste passo vamos executar um demo para testar o Robot Framework e o Python.
      Baixe o arquivo no site abaixo e extraia o mesmo no C: ou Home do linux.

      https://bitbucket.org/robotframework/webdemo/downloads/WebDemo-20130308.zip
      ou
      https://bitbucket.org/robotframework/webdemo/downloads


      Agora vamos executar os seguinte comando no CMD ou Shell do Linux, entre na pasta do webdemo pelo cmd ou shell

      3.1 Primeiro vamos executar o servidor, podemos criar um script no notepad++, é somente adicionar os comandos abaixo, save as como .bat na área de trabalho.

      cd\
      cd webdemo
      python demoapp/server.py
      pause


      ** Se executamos o comando antes de iniciar o servidor, vamos visualiza a falha abaixo.


      3.2 Agora vamos executar os comando para iniciar os testes, abra outro CMD ou Shell.

      
      pybot --variable BROWSER:Firefox login_tests
      pybot --variable BROWSER:Chrome login_tests 

      pybot --variable BROWSER:IE login_tests


      Nosso primeiro teste passou com sucesso, no entanto o restante dos testes no browser Chrome e IE falhou, neste caso precisamos baixa o driver para executar nesses browser, vamos baixar nos links abaixo e extraia dentro da pasta C:\Python27\Scripts\

      http://chromedriver.storage.googleapis.com/index.html?path=2.16/

      No chromedriver temos várias versões para Windows, Linux, Mac, instale o driver de acordo com o sistema operacional.

      IE Driver:
      Download version 2.46.0 for (recommended) 32 bit Windows IE or 64 bit Windows IE

      Após extrair os drivers no local correto, vamos re-executar os comandos:
      pybot --variable BROWSER:Chrome login_tests
      pybot --variable BROWSER:IE login_tests
       
      No Chrome nossos testes foram realizados com sucesso, no entanto no IE mostrou o
      seguinte erro "This is the initial start page for the WebDriver server."

      
      
      
      No IE, vamos Habilitar o Modo Protegido e colocar o nível para Baixo, em sites confiáveis
      adicione o http://localhost e salve e feche o IE , isso irá resolver nosso problemas no caso
      do IE 11 baixe um o arquivo o .reg e adicione ao registro, o mesmo se encontra no site abaixo:
      http://heliumhq.com/files/docs/
       
      Agora os Testes funcionaram com sucesso.
      
      
      
      4. Agora vamos instalar e configurar o jenkins.
      
      
      Continua...
       
      jenkins-python-robot-framework-parte-2

      quinta-feira, 19 de março de 2015

      Usando o nmap para pegar o IP e MAC Address


      Fiz um script para pegar o IP e o MAC de um range de IPs, é necessário quando você quer saber todos os Set-Top-Box que estão na rede, e enviar comandos de atualização, ou se comunicar com um Set-Top-Box específico.


      Nesse primeiro script quero pegar um IP através de um MAC específico em um range de ips:

      # Importa a api do NMAP
      import nmap

      # Instancia o objeto nmap.PortScanner.
      nm = nmap.PortScanner()

      # host 127.0.0.1, portas de 1 a 255
      cidr2='127.0.0.1-255'

      # insere os argumentos ao objeto nm usando a funcao scan.
      a=nm.scan(hosts=cidr2, arguments='-sP')

      # Trata os dados
      for k,v in a['scan'].iteritems():
          if str(v['status']['state']) == 'up':

              try:
                  if (str(v['addresses']['mac'])=="68:15:90:78:F7:23"):
                          print "IP: " + str(v['addresses']['ipv4'])
              except:
                  pass


      -------------------------------------------------------------------------------------------------------------------
      # Nesse script vai listar todos os dados encontrados.
      # Pode remover print str(v), nesse caso vai exibir a lista de ips e macs da rede.
      import nmap

      nm = nmap.PortScanner()
      cidr2='192.168.1.99/24'

      a=nm.scan(hosts=cidr2, arguments='-sP')

      for k,v in a['scan'].iteritems():
          if str(v['status']['state']) == 'up':
              print str(v)
              try:    print str(v['addresses']['ipv4']) + ' => ' + str(v['addresses']['mac'])
              except: print str(v['addresses']['ipv4'])





      Links Relacionados:

      http://searchsecurity.techtarget.com/tip/How-to-install-and-configure-Nmap-for-Windows
      http://pydoc.net/Python/python-libnmap/0.6.2/
      https://pypi.python.org/pypi/python-libnmap/


      Install
       Você pode instalar via pip:
      • pip install libnmap
       
      ou via git:
      • $ git clone https://github.com/savon-noir/python-libnmap.git
        $ cd python-libnmap
        $ python setup.py install
        

      É necessário instalar o nmap no sistema operacional:
      https://nmap.org/download.html