Globalcode – Open4education
Como melhoramos a performance dos testes
automatizados com py.test e factoryboy
por Leonardo Galani
Globalcode – Open4education
Globalcode – Open4education
Era uma vez um contexto…
Automação linda, rodando em ambiente de
Integração
Equipe de desenvolvimento usando python para
desenvolvimento
Testers usando usando linguagens diferentes para
desenvolver testes “afastados" da equipe de
desenvolvimento.
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Globalcode – Open4education
Olhando mais de perto…
Erros só eram encontrados quando eram executados
pelo Jenkins
Pessoal não dava muita bola e como não entendiam
muito bem porque estava falhando, deixava de lado o
problema.
Muito teste e código duplicado em algumas equipes e
métodos mirabolantes para validações simples.
Globalcode – Open4education
Globalcode – Open4education
import unittest
class SomethingTestCase(unittest.TestCase):
def test_something(self):
self.assertNotEqual('foo'.upper(), 'FOO')
Globalcode – Open4education
def test_something():
assert 'foo'.upper() != 'FOO'
Globalcode – Open4education
def test_something():
assert 'foo'.upper() == 'FOO'
def test_something2():
assert 'foo'.upper() in ['FOO', ‘foo']
def test_zero_division():
with pytest.raises(ZeroDivisionError):
10 / 2
1 / 0
Globalcode – Open4education
import pytest
@pytest.fixture
def name():
return obj(first='Baltazar', last='Barata')
@pytest.fixture
def course():
return ‘desenvolvimento de sistemas'
@pytest.fixture
def student(name, course):
return Student(first_name=name.first,
last_name=name.last,
couse=course)
def test_student(student):
assert student.first_name == 'Baltazar'
assert student.last_name == 'Barata'
Globalcode – Open4education
Globalcode – Open4education
import factory
from . import models
class StudentFactory(factory.Factory):
class Meta:
model = models.Student
first_name = 'Baltazar'
last_name = 'Barata'
course = ‘Analise e desenvolvimento’
- - -
import factory
def some_test():
student = StudentFactory()
otherStudent = StudentFactory(first_name=‘Leonardo’)
assert otherStudent.first_name == ‘Leonardo’
#poderia também realizar um loop para gerar Jsons dinâmicos
Globalcode – Open4education
Globalcode – Open4education
import factory
from factory import fuzzy
from factory_rest import RestFactory
import requests
class StudentFactory(RestFactory):
class Meta:
create_url = ‘http://api.endpoint.com/student'
create_method = 'post'
request_session = requests.session()
code = fuzzy.FuzzyText()
first_name = fuzzy.FuzzyText()
last_name = fuzzy.FuzzyText()
course = factory.SubFactory(CourseFactory)
- - -
Student = StudentFactory(course__course_name=‘marketing')
Globalcode – Open4education
Globalcode – Open4education
Marca
Pacote Licença
Produto
Produto
Marca
Sistema 1 Sistema 2
Globalcode – Open4education
Marca
model
no factory boy
Pacote
Licença
model
no factory boy
Produto
model
no factory boy
Produto
model
no factory boy
Marca
model
no factory boy
Sistema 1 Sistema 2
model
no factory boy
Globalcode – Open4education
requests.session
para sistema1
fixture
requests.session
para sistema2
fixture
Tokens e Headers
fixture
Massa especifica para
N cenários
fixture
Globalcode – Open4education
Conclusão
py.test é um incrível ferramenta de teste
(“framework de automação")
FactoryBoy é uma ótima opção para geração de
dependências / massa de teste
As duas ferramentas podem ser usadas tanto para
teste de aceitação / funcional, quanto para testes
unitários, logo a adoção do padrão por toda equipe
é muito mais fácil e desenvolvedores conseguem
extender testes funcionais se necessário.
Globalcode – Open4education
Globalcode – Open4education
the end.
agiletesters.com.br
keeptesting.com.br
lazytester.com
factoryboy.readthedocs.org
https://github.com/bertonha (factory_rest)
titansgroup.com.br
Titans está contratando! rh@titansgroup.com.br

Como melhoramos a performance dos testes automatizados com py.test e factoryboy

  • 1.
    Globalcode – Open4education Comomelhoramos a performance dos testes automatizados com py.test e factoryboy por Leonardo Galani
  • 2.
  • 3.
    Globalcode – Open4education Erauma vez um contexto… Automação linda, rodando em ambiente de Integração Equipe de desenvolvimento usando python para desenvolvimento Testers usando usando linguagens diferentes para desenvolver testes “afastados" da equipe de desenvolvimento.
  • 4.
  • 5.
  • 6.
  • 7.
    Globalcode – Open4education Olhandomais de perto… Erros só eram encontrados quando eram executados pelo Jenkins Pessoal não dava muita bola e como não entendiam muito bem porque estava falhando, deixava de lado o problema. Muito teste e código duplicado em algumas equipes e métodos mirabolantes para validações simples.
  • 8.
  • 9.
    Globalcode – Open4education importunittest class SomethingTestCase(unittest.TestCase): def test_something(self): self.assertNotEqual('foo'.upper(), 'FOO')
  • 10.
    Globalcode – Open4education deftest_something(): assert 'foo'.upper() != 'FOO'
  • 11.
    Globalcode – Open4education deftest_something(): assert 'foo'.upper() == 'FOO' def test_something2(): assert 'foo'.upper() in ['FOO', ‘foo'] def test_zero_division(): with pytest.raises(ZeroDivisionError): 10 / 2 1 / 0
  • 12.
    Globalcode – Open4education importpytest @pytest.fixture def name(): return obj(first='Baltazar', last='Barata') @pytest.fixture def course(): return ‘desenvolvimento de sistemas' @pytest.fixture def student(name, course): return Student(first_name=name.first, last_name=name.last, couse=course) def test_student(student): assert student.first_name == 'Baltazar' assert student.last_name == 'Barata'
  • 13.
  • 14.
    Globalcode – Open4education importfactory from . import models class StudentFactory(factory.Factory): class Meta: model = models.Student first_name = 'Baltazar' last_name = 'Barata' course = ‘Analise e desenvolvimento’ - - - import factory def some_test(): student = StudentFactory() otherStudent = StudentFactory(first_name=‘Leonardo’) assert otherStudent.first_name == ‘Leonardo’ #poderia também realizar um loop para gerar Jsons dinâmicos
  • 15.
  • 16.
    Globalcode – Open4education importfactory from factory import fuzzy from factory_rest import RestFactory import requests class StudentFactory(RestFactory): class Meta: create_url = ‘http://api.endpoint.com/student' create_method = 'post' request_session = requests.session() code = fuzzy.FuzzyText() first_name = fuzzy.FuzzyText() last_name = fuzzy.FuzzyText() course = factory.SubFactory(CourseFactory) - - - Student = StudentFactory(course__course_name=‘marketing')
  • 17.
  • 18.
    Globalcode – Open4education Marca PacoteLicença Produto Produto Marca Sistema 1 Sistema 2
  • 19.
    Globalcode – Open4education Marca model nofactory boy Pacote Licença model no factory boy Produto model no factory boy Produto model no factory boy Marca model no factory boy Sistema 1 Sistema 2 model no factory boy
  • 20.
    Globalcode – Open4education requests.session parasistema1 fixture requests.session para sistema2 fixture Tokens e Headers fixture Massa especifica para N cenários fixture
  • 21.
    Globalcode – Open4education Conclusão py.testé um incrível ferramenta de teste (“framework de automação") FactoryBoy é uma ótima opção para geração de dependências / massa de teste As duas ferramentas podem ser usadas tanto para teste de aceitação / funcional, quanto para testes unitários, logo a adoção do padrão por toda equipe é muito mais fácil e desenvolvedores conseguem extender testes funcionais se necessário.
  • 22.
  • 23.
    Globalcode – Open4education theend. agiletesters.com.br keeptesting.com.br lazytester.com factoryboy.readthedocs.org https://github.com/bertonha (factory_rest) titansgroup.com.br Titans está contratando! rh@titansgroup.com.br