25 de out de 2012

Testes Funcionais - Selenium WebDriver

     O Selenium é uma ferramenta para automatização do navegador (playback e scripting), usado para testar aplicações web.  No Django 1.4 temos o LiveServerTestCase para testar o servidor, facilitando a integração de testes do Django com o Selenium.
    O WebDriver são as ações do navegador através da API (no Django é usado a linguagem Python). Ele suporta diferentes navegadores: Firefox, Chrome, IE. Suas funções são: pegar a página, os elementos, adicionar um input e manipular esses elementos.

Instalação:
# pip install selenium
ou
# easy_install selenium

Buscando elementos:
driver.find_element_by_id('id_usuario') 
driver.find_element_by_name('zeldani')
driver.find_element_by_xpath('//input')
driver.find_element_by_link_text('Proximo')
driver.find_element_by_partial_link_text('Prox')
driver.find_element_by_tag_name('frame')
driver.find_element_by_class_name('body')
driver.find_element_by_css_selector('input') 


Enviando dados:
element.send_keys("zeldani", Keys.TAB)
element.send_keys("senha123")
element.submit()

Botões:
element.click() 

Alguns métodos dos elementos:
- text(self); click(self); submit(self); clear(self); get_attribute(self, name).

  • Primeiro Exemplo:
     Você pode fazer os testes usando o módulo Python unittest. Digite o código abaixo e depois execute: $ python tests.py
     A explicação do código está nos comentários.

import unittest  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

    def setUp(self): 
        self.driver = webdriver.Firefox() 
    def teste_busca_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title) 
        elem = driver.find_element_by_name("q") 
        elem.send_keys("selenium")
        elem.send_keys(Keys.RETURN)
        self.assertIn("Google", driver.title) 
    def tearDown(self): 
        self.driver.close() 

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

     Nesse primeiro exemplo vai ser aberto o url www.python.org, depois vai buscar pela palavra selenium no google.

  • Segundo Exemplo:
     Nesse segundo exemplo vamos criar uma unit test do Django, para testar a administração do site. Salve como tests.py na sua aplicação.
     Digite o código abaixo e depois execute na pasta raiz do projeto:  
$./manage.py test nome_da_app

import time
from django.test import LiveServerTestCase
from selenium.webdriver.firefox.webdriver import WebDriver

class BaseTestCase(LiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = WebDriver()
        super(BaseTestCase, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        super(BaseTestCase, cls).tearDownClass()
        cls.driver.quit()

class AdminTeste(BaseTestCase):
    def teste_login(self):
        self.driver.get(self.live_server_url + '/admin/') 
        self.driver.find_element_by_id('id_username').send_keys('admin') 
        password = self.driver.find_element_by_id('id_password') 
        password.send_keys('123') .
        password.submit() 
        time.sleep(2)

    Uma dica é usar o firebug para confirmar o id do usuário e senha. Caso você tenha problemas com a senha na hora de logar, é preciso criar uma initial data pelas fixtures. Uma fixture é uma coleção de dados do Django, para ele saber como importar do banco de dados. Nesse exemplo vamos criar a fixture usando o JSON (JavaScript Object Notation).
     Crie um diretório na sua aplicação chamado "fixtures" e salve o conteúdo abaixo como initial_data.json:
[
    {
        "pk": 1,
        "model": "auth.user",
        "fields": {
            "username": "admin",
            "first_name": "",
            "last_name": "",
            "is_active": true,
            "is_superuser": true,
            "is_staff": true,
            "last_login": "2012-10-20 04:15:37+00:00",
            "groups": [],
            "user_permissions": [],
            "password": "senha criptografada",
            "email": "admin@gmail.com",
            "date_joined": "2012-10-19 18:36:07+00:00"
        }
    }
]


     Modifique o campo "password" com a senha criptografada do admin. No artigo sobre dicas django tem como saber a senha, data do último login e de criação do usuário!! ;)
    O segundo exemplo vai testar a página de administração do Django, inserindo o usuário e senha.

* Fontes:
http://selenium-python.readthedocs.org
https://docs.djangoproject.com/en/dev/howto/initial-data/ 
https://www.shiningpanda-ci.com 
http://benlopatin.com/2012/django-selenium-testing/
http://www.rkblog.rk.edu.pl/w/p/testing-django-applications-selenium/
http://www.arthurkoziel.com/2008/09/04/automatical-superuser-creation-django/

2 comentários:

ptcmariano disse...

Dava pra caprichar mais no post. Por exemplo Selenium não é para teste unitário, mas para testes funcionais. Para teste unitarios use PyUnit!

Zeldani: disse...

valeu a dica, fiz algumas correções no artigo!! ;P

Postar um comentário