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

Preview:

Citation preview

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! rh@titansgroup.com.br