Upgrade to Pro — share decks privately, control downloads, hide ads and more …

factory_boy: Testando Objetos Complexos Python Brasil 2021

Camila Maia
October 11, 2021

factory_boy: Testando Objetos Complexos Python Brasil 2021

Camila Maia

October 11, 2021
Tweet

More Decks by Camila Maia

Other Decks in Technology

Transcript

  1. @cmaiacd
    factory_boy
    Python Brasil - Out 2021
    Camila Maia
    Testando Objetos Complexos

    View Slide

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

    View Slide

  3. @cmaiacd
    Quem sou eu?

    View Slide

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

    View Slide

  5. @cmaiacd
    Criadora da ScanAPI

    View Slide

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

    View Slide

  7. @cmaiacd
    factory_boy: o quê é?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. @cmaiacd
    Aplicação Exemplo

    View Slide

  13. @cmaiacd
    Polls

    View Slide

  14. @cmaiacd
    Poll

    View Slide

  15. @cmaiacd
    Results

    View Slide

  16. @cmaiacd
    Modelo - Poll
    Poll Question Choice
    n:1
    pub_date : DateTimeField
    premium : BooleanField
    author : CharField
    question_text : CharField
    language : CharField
    choice_text : CharField
    votes : IntegerField
    1:1

    View Slide

  17. @cmaiacd
    Create Question - Admin

    View Slide

  18. @cmaiacd
    Create Question - Admin

    View Slide

  19. @cmaiacd
    Questions - Admin

    View Slide

  20. @cmaiacd
    Modelo - Poll

    View Slide

  21. @cmaiacd
    Modelo - Poll

    View Slide

  22. @cmaiacd
    Modelo - Question

    View Slide

  23. @cmaiacd
    Modelo - Choice

    View Slide

  24. @cmaiacd
    Boas Práticas

    View Slide

  25. @cmaiacd
    ● +3 anos
    ● Monolito Django
    ● +230 tabelas
    ● +2200 arquivos relevantes
    ● +75k linhas relevantes de
    Minha Experiência

    View Slide

  26. @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
    ● Teste voltado para satisfazer a fixture
    ● Os desenvolvedores se deparam com o mesmo problema
    repetidamente
    ● A mesma gambis tem que ser feita repetidamente

    View Slide

  27. @cmaiacd
    Factories ruins são como vírus

    View Slide

  28. @cmaiacd
    1. FACTORIES DEVEM REPRESENTAR SEUS
    MODELOS

    View Slide

  29. @cmaiacd
    RUIM ❌

    View Slide

  30. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

  32. @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

    View Slide

  33. @cmaiacd
    RUIM ❌

    View Slide

  34. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

  37. @cmaiacd
    RUIM ❌

    View Slide

  38. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  42. @cmaiacd
    RUIM ❌

    View Slide

  43. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  47. @cmaiacd
    Bom ✅

    View Slide

  48. @cmaiacd
    6. FIXTURES APENAS COMO WRAPPERS

    View Slide

  49. @cmaiacd
    BOM ✅

    View Slide

  50. @cmaiacd
    7. EVITAR O USO DE FIXTURES
    COMPARTILHADAS ENTRE ARQUIVOS

    View Slide

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

    View Slide

  52. @cmaiacd
    Código
    Código

    View Slide

  53. @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
    Recapitulando

    View Slide

  54. @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

    View Slide

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

    View Slide

  56. @cmaiacd
    Sobre Faker

    View Slide