• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Testes no Django
 

Testes no Django

on

  • 907 views

 

Statistics

Views

Total Views
907
Views on SlideShare
729
Embed Views
178

Actions

Likes
0
Downloads
19
Comments
0

1 Embed 178

http://estudepy.wordpress.com 178

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Testes no Django Testes no Django Presentation Transcript

  • TESTES NO DJANGO
  • PORQUE TESTAR MEU PROJETO?Um código sem testes é quebrado pelo Testes, querendo ou não, também édesenvolvimento. uma forma de documentação.
  • ESTRUTURA DO PROJETO DJANGO
  • ESTRUTURA DO PROJETO DJANGOproject_root/ manage.py project/ __init__.py settings.py urls.py wsgi.py seuaplicativo/ __init__.py models.py tests.py urls.py views.py
  • ESTRUTURA DO PROJETO DJANGOproject_root/ manage.py project/ __init__.py settings.py urls.py Um dos aplicativos de seu projeto (ex.: produtos) wsgi.py $ python manage.py startapp seuaplicativo seuaplicativo/ __init__.py models.py Arquivo de testes relacionados ao seu aplicativo tests.py urls.py views.py
  • COMEÇANDO A TESTAR
  • COMEÇANDO A TESTAR$ django-admin.py startproject testes
  • COMEÇANDO A TESTAR$ django-admin.py startproject testes$ cd testes
  • COMEÇANDO A TESTAR$ django-admin.py startproject testes$ cd testes$ python manage.py test
  • COMEÇANDO A TESTAR$ django-admin.py startproject testes$ cd testes$ python manage.py testCreating test database for alias default.........................................................................................................................................................................................................................................................................................................................................................s........................................................................--------------------------------------------------Ran 416 tests in 28.259sOK (skipped=1)Destroying test database for alias default...
  • 28 SEGUNDOS DE ESPERA
  • 28 SEGUNDOS DE ESPERA
  • EXECUTANDO SOMENTE APLICATIVOS ESPECÍFICOS
  • EXECUTANDO SOMENTE APLICATIVOS ESPECÍFICOS $ python manage.py test nomedoaplicativo
  • EXECUTANDO CLASSES DE TESTES ESPECÍFICAS
  • EXECUTANDO CLASSES DE TESTES ESPECÍFICAS $ python manage.py test nomedoaplicativo.NomeDaClasse
  • EXECUTANDO UM TESTE ESPECÍFICO
  • EXECUTANDO UM TESTE ESPECÍFICO $ python manage.py test nomedoaplicativo.NomeDaClasse.test_soma
  • TIPOS DE TESTES
  • TIPOS DE TESTES• Testes unitários
  • TIPOS DE TESTES• Testes unitários• Testes de integração
  • TESTES UNITÁRIOS Baby Step
  • TESTES UNITÁRIOS• Excelente para testar unidades de códigos (como funcionalidades ou métodos) Baby Step
  • TESTES UNITÁRIOS• Excelente para testar unidades de códigos (como funcionalidades ou métodos)• Rápido e focado (falhas úteis) Baby Step
  • TESTES UNITÁRIOS• Excelente para testar unidades de códigos (como funcionalidades ou métodos)• Rápido e focado (falhas úteis)• Muito útil para testar componentes críticos Baby Step
  • TESTES DE INTEGRAÇÃO
  • TESTES DE INTEGRAÇÃO• Testa se todo o sistema integrado funciona como deveria.
  • TESTES DE INTEGRAÇÃO• Testa se todo o sistema integrado funciona como deveria.•É lento
  • TESTES DE INTEGRAÇÃO• Testa se todo o sistema integrado funciona como deveria.•É lento• As falhas retornadas não são tão específicas
  • TESTES DE INTEGRAÇÃO• Testa se todo o sistema integrado funciona como deveria.•É lento• As falhas retornadas não são tão específicas• Escreve-se menos teste
  • FERRAMENTAS
  • FERRAMENTAS• unittest / unittest2
  • FERRAMENTAS• unittest / unittest2• doctest
  • FERRAMENTAS• unittest / unittest2• doctest• nose
  • FERRAMENTAS• unittest / unittest2• doctest unittest (biblioteca) != Testes Unitários (prática)• nose
  • TESTES UNITÁRIOS """This file demonstrates writing tests using the unittest module. These will passwhen you run "manage.py test".Replace this with more appropriate tests for your application."""from django.test import TestCaseclass SimpleTest(TestCase):    def test_basic_addition(self):        """        Tests that 1 + 1 always equals 2.        """        self.assertEqual(1 + 1, 2)
  • django.test.TestCase• Roda cada teste dentro de uma transação• Volta (rollback) a transação a cada final de teste executado
  • MÉTODOS DISPONÍVEIS• assertEqual• assertNotEqual• assertTrue• assertFalse• assertRaises
  • USO DE FIXTURES$ python manage.py dumpdata aplicacao > aplicacao.json...class AplicacaoTestCase(TestCase): fixtures = [aplicacao.json] def test_moficar_usuario(self): ......
  • USO DE FIXTURES$ python manage.py dumpdata aplicacao > aplicacao.json...class AplicacaoTestCase(TestCase): fixtures = [aplicacao.json] def test_moficar_usuario(self): ......
  • PORQUE NÃO USAR FIXTURES?
  • PORQUE NÃO USAR FIXTURES?• Difícil de manter e atualizar
  • PORQUE NÃO USAR FIXTURES?• Difícil de manter e atualizar• Aumenta dependências para execução de testes.
  • PORQUE NÃO USAR FIXTURES?• Difícil de manter e atualizar• Aumenta dependências para execução de testes.• Lento para ser carregado
  • MODEL FACTORY
  • USANDO MODEL FACTORY factory_boyclass ProfileFactory(factory.Factory): FACTORY_FOR = Profile age = 65 address = "Av. Presidente Vargas, 2121" user = factory.SubFactory(UserFactory)
  • USANDO MODEL FACTORY factory_boyclass ProfileFactory(factory.Factory): FACTORY_FOR = Profile age = 65 address = "Av. Presidente Vargas, 2121" user = factory.SubFactory(UserFactory)profile = ProfileFactory.create( age=21, user__username="vinicius")
  • USANDO MODEL FACTORYdef test_address(self): """Testa se o endereço do usuário é a vargas""" profile = ProfileFactory.create( age=21, user__username="vinicius") self.assertTrue("Vargas" in profile.address)
  • PORQUE USAR MODEL FACTORY?
  • PORQUE USAR MODEL FACTORY?• Fácil de dar manutenção
  • PORQUE USAR MODEL FACTORY?• Fácil de dar manutenção• Não cria nenhum dado que você não irá utilizar
  • TESTANDO VIEWS
  • TESTAR VIEWS NÃO É FÁCIL!
  • TESTAR VIEWS NÃO É FÁCIL!• Views tem muitas dependências.
  • TESTAR VIEWS NÃO É FÁCIL!• Views tem muitas dependências.• Templates, database, middleware, url routing...
  • django.test.Clientimport datetimefrom django.test import TestCaseclass PollsViewsTestCase(TestCase): def test_index(self): resp = self.client.get(/polls/) self.assertEqual(resp.status_code, 200)
  • django.test.Client url = "/case/edit/{0}".format(case.pk)step = case.steps.get()response = self.client.post(url, { "product": case.product.id, "name": case.name, "description": case.description, "steps-TOTAL_FORMS": 2, "steps-INITIAL_FORMS": 1, "steps-MAX_NUM_FORMS": 3, "steps-0-step": step.step, "steps-0-expected": step.expected, "steps-1-step": "Click link.", "steps-1-expected": "Account active.", "status": case.status,})
  • django.test.Client url = "/case/edit/{0}".format(case.pk)step = case.steps.get()response = self.client.post(url, { "product": case.product.id, "name": case.name, "description": case.description, "steps-TOTAL_FORMS": 2, "steps-INITIAL_FORMS": 1, "steps-MAX_NUM_FORMS": 3, "steps-0-step": step.step, "steps-0-expected": step.expected, "steps-1-step": "Click link.", "steps-1-expected": "Account active.", "status": case.status,})
  • WEBTEST! url = "/case/edit/{0}".format(case.pk)form = self.app.get(url).forms["case-form"]form["steps-1-step"] = "Click link."form["steps-1-expected"] = "Account active."response = form.submit()
  • WebTest x django.test.Client• Testes ficam mais fáceis e mais rápidos para serem escritos.• Traz mais confiança de como a view funciona• django-webtest é a biblioteca utilizada
  • WebTest x django.test.Client self.assertEqual( response.json, ["one", "two", "three"])self.assertEqual( resp.html.find("a", title="Login").href, "/login/" )
  • TESTES AUTOMATIZADOS NO NAVEGADOR
  • MUITO FÁCIL!• Especialmente no Django 1.4•pip install selenium•LiveServerTestCase
  • from django.test import LiveServerTestCasefrom selenium.webdriver.firefox.webdriver import WebDriverclass MySeleniumTests(LiveServerTestCase): @classmethod def setUpClass(cls): cls.selenium = WebDriver() super(MySeleniumTests, cls).setUpClass() @classmethod def tearDownClass(cls): super(MySeleniumTests, cls).tearDownClass() cls.selenium.quit() def test_login(self): self.selenium.get( "%s%s" % (self.live_server_url, "/login/")) username_input = self.selenium.find_element_by_name( "username") username_input.send_keys("myuser") password_input = self.selenium.find_element_by_name( "password") password_input.send_keys("secret") self.selenium.find_element_by_xpath( //input[@value="Log in"]).click()
  • ALGUMAS PERGUNTASNão testar python core Em Bugs é legal escrever um testecomponentes para provar a existencia do bug.(datetime)Não testar Django core
  • ALGUMAS PERGUNTAS•O que eu devo (ou não testar)? Não testar python core Em Bugs é legal escrever um teste componentes para provar a existencia do bug. (datetime) Não testar Django core
  • ALGUMAS PERGUNTAS•O que eu devo (ou não testar)?• Quão fundo devo ir em um teste? Não testar python core Em Bugs é legal escrever um teste componentes para provar a existencia do bug. (datetime) Não testar Django core
  • ALGUMAS PERGUNTAS•O que eu devo (ou não testar)?• Quão fundo devo ir em um teste?• Devo escrever o teste primeiro ou devo, antes, escrever o código? Não testar python core Em Bugs é legal escrever um teste componentes para provar a existencia do bug. (datetime) Não testar Django core