como melhoramos a performance dos testes automatizados com py.test e factoryboy
TRANSCRIPT
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
#e realizar algum teste em um End point ou até mesmo de carga
que
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
ProdutoMarca
Sistema 1 Sistema 2
Globalcode – Open4education
Marcamodel
no factory boy
PacoteLicençamodel
no factory boy
Produtomodel
no factory boy
Produto model
no factory boy
Marcamodel
no factory boy
Sistema 1 Sistema 2
modelno factory boy
Globalcode – Open4education
requests.session para sistema1
fixture
requests.session para sistema2
fixture
Tokens e Headersfixture
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! [email protected]