Slide 1

Slide 1 text

@cmaiacd factory_boy 60º Python Floripa on-line - Jun 2021 Camila Maia Testing like a pro

Slide 2

Slide 2 text

@cmaiacd Esta apresentação está disponível em: speakerdeck.com/cmaiacd

Slide 3

Slide 3 text

@cmaiacd Quem sou eu?

Slide 4

Slide 4 text

@cmaiacd Quem sou eu? Desenvolvedora Backend 10+ anos xp 👵 Python 🐍 e Ruby 💎 OpenSource e Comunidades ❤ Organização de eventos

Slide 5

Slide 5 text

@cmaiacd Criadora da ScanAPI

Slide 6

Slide 6 text

@cmaiacd Primeiro perfil aprovado no programa de Sponsors para quem reside no Brasil 󰎙 Quem sou eu?

Slide 7

Slide 7 text

@cmaiacd factory_boy: o quê é?

Slide 8

Slide 8 text

@cmaiacd ● Ferramenta que substitui fixtures ● Baseada no factory_bot (Thoughtbot) ● Primeira versão: só Django ● Atualmente: independe de framework

Slide 9

Slide 9 text

@cmaiacd Para objetos complexos ❌ Fixtures: estáticas, de difícil manutenção ✅ Factories: fácil de usar

Slide 10

Slide 10 text

@cmaiacd ❌ configuração de teste extensa todas as combinações possíveis cobrindo todas as exceções ✅ objetos personalizados para o teste atual enquanto apenas declara os campos específicos do teste

Slide 11

Slide 11 text

@cmaiacd Possui muitas ferramentas que auxiliam na criação dos testes: ● Sequence ● Fuzzy attributes ● Faker ● LazyFunction ● LazyAttribute ● Herança ● Params ● Traits ● Strategies ● RelatedFactory/SubFactory

Slide 12

Slide 12 text

@cmaiacd Aplicação Exemplo

Slide 13

Slide 13 text

@cmaiacd Questions - Admin

Slide 14

Slide 14 text

@cmaiacd Create Question - Admin

Slide 15

Slide 15 text

@cmaiacd Create Question - Admin

Slide 16

Slide 16 text

@cmaiacd Polls

Slide 17

Slide 17 text

@cmaiacd Poll

Slide 18

Slide 18 text

@cmaiacd Results

Slide 19

Slide 19 text

@cmaiacd Modelo - Question

Slide 20

Slide 20 text

@cmaiacd Modelo - Question

Slide 21

Slide 21 text

@cmaiacd Modelo - Choice

Slide 22

Slide 22 text

@cmaiacd Instalar

Slide 23

Slide 23 text

@cmaiacd $ pip install factory_boy

Slide 24

Slide 24 text

@cmaiacd Utilizar

Slide 25

Slide 25 text

@cmaiacd Factories

Slide 26

Slide 26 text

@cmaiacd shell

Slide 27

Slide 27 text

@cmaiacd shell

Slide 28

Slide 28 text

@cmaiacd Boas Práticas

Slide 29

Slide 29 text

@cmaiacd Factories ruins são como vírus ● Fixtures podem ficar muito amarradas ● Erros implícitos podem ocorrer ● Muito copiar / colar com pequenas alterações ● Uma fixture mal projetada pode afetar muitos testes ● Os desenvolvedores se deparam com o mesmo problema repetidamente ● A mesma gambis tem que ser feita repetidamente

Slide 30

Slide 30 text

@cmaiacd 1. FACTORIES DEVEM REPRESENTAR SEUS MODELOS

Slide 31

Slide 31 text

@cmaiacd Modelos

Slide 32

Slide 32 text

@cmaiacd RUIM ❌

Slide 33

Slide 33 text

@cmaiacd BOM ✅

Slide 34

Slide 34 text

@cmaiacd 2. OS TESTES NÃO DEVEM DEPENDER DOS VALORES DEFAULT

Slide 35

Slide 35 text

@cmaiacd ● Se alguém modificar o valor default, seu teste irá quebrar. ● O teste precisa ter todo o setup necessário para garantir que sempre irá funcionar

Slide 36

Slide 36 text

@cmaiacd RUIM ❌

Slide 37

Slide 37 text

@cmaiacd BOM ✅

Slide 38

Slide 38 text

@cmaiacd 3. FACTORIES DEVEM CONTER APENAS OS CAMPOS NECESSÁRIOS

Slide 39

Slide 39 text

@cmaiacd Se o campo é nullable (null=True) o atributo deve estar em uma trait e não como valor default

Slide 40

Slide 40 text

@cmaiacd RUIM ❌

Slide 41

Slide 41 text

@cmaiacd BOM ✅

Slide 42

Slide 42 text

@cmaiacd ● O método `.save()` irá funcionar? ● Quando vamos nos lembrar de testar QuestionFactory(author=None)? ● Não podemos assumir que existe um campo, quando o BD nos permite tê-lo como nulo.

Slide 43

Slide 43 text

@cmaiacd 4. EVITAR O USO DO .CREATE()

Slide 44

Slide 44 text

@cmaiacd ● MyFactory.build() cria objeto local (memória) ● MyFactory.create() objeto local + salva no banco de dados

Slide 45

Slide 45 text

@cmaiacd RUIM ❌

Slide 46

Slide 46 text

@cmaiacd BOM ✅

Slide 47

Slide 47 text

@cmaiacd BUILD STRATEGY ======================== 14 passed in 1.76 seconds ========================= CREATE STRATEGY ======================== 14 passed in 3.26 seconds =========================

Slide 48

Slide 48 text

@cmaiacd 5. FK PRESENTE NA TABELA? UTILIZAR SubFactory FK PRESENTE NA OUTRA TABELA? UTILIZAR RelatedFactory + TRAIT

Slide 49

Slide 49 text

@cmaiacd ● SubFactory: build/create durante o processo de criação da primeira factory ● RelatedFactory: build/create depois da criação da primeira factory.

Slide 50

Slide 50 text

@cmaiacd Bom ✅

Slide 51

Slide 51 text

@cmaiacd 6. FIXTURES APENAS COMO WRAPPERS

Slide 52

Slide 52 text

@cmaiacd BOM ✅

Slide 53

Slide 53 text

@cmaiacd 7. EVITAR O USO DE FIXTURES COMPARTILHADAS ENTRE ARQUIVOS, COMO CONFTEST

Slide 54

Slide 54 text

@cmaiacd ● Muitos testes dependendo da mesma fixtures ● Tende a inflar a fixture ● Difícil de manter ● Altera a fixture => quebra muitos testes

Slide 55

Slide 55 text

@cmaiacd Código Código

Slide 56

Slide 56 text

@cmaiacd 1. Factories devem representar seus modelos 2. Os testes não devem depender dos valores default 3. Factories devem conter apenas os campos necessários 4. Evitar o uso do .create() 5. FK presente na tabela? Utilizar SubFactory FK presente na outra tabela? Utilizar RelatedFactory + Trait 6. Fixtures apenas como wrappers 7. Evitar o uso de fixtures compartilhadas entre arquivos, como conftest Recapitulando

Slide 57

Slide 57 text

@cmaiacd Sobre Faker

Slide 58

Slide 58 text

@cmaiacd Factory Boy Doc completa: https://factoryboy.readthedocs.io/en/stable/ Código: https://github.com/FactoryBoy/factory_boy Faker Faker doc: https://faker.readthedocs.io/en/master/ Standard providers: https://faker.readthedocs.io/en/stable/providers.html Community providers: https://faker.readthedocs.io/en/stable/communityproviders.html Referências

Slide 59

Slide 59 text

@cmaiacd MUITO OBRIGADA! @cmaiacd camilamaia 󰠁 cmaiacd.com