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

60º Python Floripa on-line : Factory Boy - testing like a pro

60º Python Floripa on-line : Factory Boy - testing like a pro

https://www.meetup.com/pt-BR/Floripa-Python-Meetup/events/278700040/

"import this

Encerramos o nosso primeiro semestre completando 60 edições da Python Floripa! Continuamos com nossos encontros on-line, novamente, teremos uma grade de palestras especial para vocês:

Programação

14h00 - Apresentação
14h20 - Factory_boy: testing like a pro - Camila Maia
15h00 - Bokeh - Visão geral e como contribuir - Iury Piva
15h40 - Lightning talks (palestras, apresentações, comunicados, etc. limitados a 5min de duração cada). Inscrições feitas na hora.
16h00 - Organizando a Python Brasil 2021: desafios e aprendizados de organizar a versão online - Alynne Ferreira
16h40 - Encerramento

*A grade de programação poderá sofrer alterações

Para perguntas aos palestrantes e incrições nas Lighting Talks, utilize o chat do Youtube."

Camila Maia

June 26, 2021
Tweet

More Decks by Camila Maia

Other Decks in Technology

Transcript

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

    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

    View Slide

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

    View Slide

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

    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
    Questions - Admin

    View Slide

  14. @cmaiacd
    Create Question - Admin

    View Slide

  15. @cmaiacd
    Create Question - Admin

    View Slide

  16. @cmaiacd
    Polls

    View Slide

  17. @cmaiacd
    Poll

    View Slide

  18. @cmaiacd
    Results

    View Slide

  19. @cmaiacd
    Modelo - Question

    View Slide

  20. @cmaiacd
    Modelo - Question

    View Slide

  21. @cmaiacd
    Modelo - Choice

    View Slide

  22. @cmaiacd
    Instalar

    View Slide

  23. @cmaiacd
    $ pip install factory_boy

    View Slide

  24. @cmaiacd
    Utilizar

    View Slide

  25. @cmaiacd
    Factories

    View Slide

  26. @cmaiacd
    shell

    View Slide

  27. @cmaiacd
    shell

    View Slide

  28. @cmaiacd
    Boas Práticas

    View Slide

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

    View Slide

  30. @cmaiacd
    1. FACTORIES DEVEM REPRESENTAR SEUS
    MODELOS

    View Slide

  31. @cmaiacd
    Modelos

    View Slide

  32. @cmaiacd
    RUIM ❌

    View Slide

  33. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

  36. @cmaiacd
    RUIM ❌

    View Slide

  37. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

  40. @cmaiacd
    RUIM ❌

    View Slide

  41. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  45. @cmaiacd
    RUIM ❌

    View Slide

  46. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

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

  50. @cmaiacd
    Bom ✅

    View Slide

  51. @cmaiacd
    6. FIXTURES APENAS COMO WRAPPERS

    View Slide

  52. @cmaiacd
    BOM ✅

    View Slide

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

    View Slide

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

    View Slide

  55. @cmaiacd
    Código
    Código

    View Slide

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

    View Slide

  57. @cmaiacd
    Sobre Faker

    View Slide

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

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

    View Slide