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

Factory_boy: testing like a pro

Factory_boy: testing like a pro

Palestra apresentada pela Camila Maia na 60º Python Floripa on-line https://www.youtube.com/watch?v=NVJRklJswBs

23f134e5e0567efeff45ecfaa8702f37?s=128

Python Floripa

June 26, 2021
Tweet

Transcript

  1. @cmaiacd factory_boy 60º Python Floripa on-line - Jun 2021 Camila

    Maia Testing like a pro
  2. @cmaiacd Esta apresentação está disponível em: speakerdeck.com/cmaiacd

  3. @cmaiacd Quem sou eu?

  4. @cmaiacd Quem sou eu? Desenvolvedora Backend 10+ anos xp 👵

    Python 🐍 e Ruby 💎 OpenSource e Comunidades ❤ Organização de eventos
  5. @cmaiacd Criadora da ScanAPI

  6. @cmaiacd Primeiro perfil aprovado no programa de Sponsors para quem

    reside no Brasil 󰎙 Quem sou eu?
  7. @cmaiacd factory_boy: o quê é?

  8. @cmaiacd • Ferramenta que substitui fixtures • Baseada no factory_bot

    (Thoughtbot) • Primeira versão: só Django • Atualmente: independe de framework
  9. @cmaiacd Para objetos complexos ❌ Fixtures: estáticas, de difícil manutenção

    ✅ Factories: fácil de usar
  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
  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
  12. @cmaiacd Aplicação Exemplo

  13. @cmaiacd Questions - Admin

  14. @cmaiacd Create Question - Admin

  15. @cmaiacd Create Question - Admin

  16. @cmaiacd Polls

  17. @cmaiacd Poll

  18. @cmaiacd Results

  19. @cmaiacd Modelo - Question

  20. @cmaiacd Modelo - Question

  21. @cmaiacd Modelo - Choice

  22. @cmaiacd Instalar

  23. @cmaiacd $ pip install factory_boy

  24. @cmaiacd Utilizar

  25. @cmaiacd Factories

  26. @cmaiacd shell

  27. @cmaiacd shell

  28. @cmaiacd Boas Práticas

  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
  30. @cmaiacd 1. FACTORIES DEVEM REPRESENTAR SEUS MODELOS

  31. @cmaiacd Modelos

  32. @cmaiacd RUIM ❌

  33. @cmaiacd BOM ✅

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

  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
  36. @cmaiacd RUIM ❌

  37. @cmaiacd BOM ✅

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

  39. @cmaiacd Se o campo é nullable (null=True) o atributo deve

    estar em uma trait e não como valor default
  40. @cmaiacd RUIM ❌

  41. @cmaiacd BOM ✅

  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.
  43. @cmaiacd 4. EVITAR O USO DO .CREATE()

  44. @cmaiacd • MyFactory.build() cria objeto local (memória) • MyFactory.create() objeto

    local + salva no banco de dados
  45. @cmaiacd RUIM ❌

  46. @cmaiacd BOM ✅

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

    CREATE STRATEGY ======================== 14 passed in 3.26 seconds =========================
  48. @cmaiacd 5. FK PRESENTE NA TABELA? UTILIZAR SubFactory FK PRESENTE

    NA OUTRA TABELA? UTILIZAR RelatedFactory + TRAIT
  49. @cmaiacd • SubFactory: build/create durante o processo de criação da

    primeira factory • RelatedFactory: build/create depois da criação da primeira factory.
  50. @cmaiacd Bom ✅

  51. @cmaiacd 6. FIXTURES APENAS COMO WRAPPERS

  52. @cmaiacd BOM ✅

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

    COMO CONFTEST
  54. @cmaiacd • Muitos testes dependendo da mesma fixtures • Tende

    a inflar a fixture • Difícil de manter • Altera a fixture => quebra muitos testes
  55. @cmaiacd Código Código

  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
  57. @cmaiacd Sobre Faker

  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
  59. @cmaiacd MUITO OBRIGADA! @cmaiacd camilamaia 󰠁 cmaiacd.com