Save 37% off PRO during our Black Friday Sale! »

factory_boy: Testando Objetos Complexos Python Brasil 2021

factory_boy: Testando Objetos Complexos Python Brasil 2021

1fa11e9179b8f5c08b3a0b5deb578fac?s=128

Camila Maia

October 11, 2021
Tweet

Transcript

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

    Objetos Complexos
  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 • Unittest, Pytest...
  9. @cmaiacd Para objetos complexos ❌ Fixtures: estáticas, de difícil manutenção

    ✅ Factories: fácil de usar
  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
  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 Polls

  14. @cmaiacd Poll

  15. @cmaiacd Results

  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
  17. @cmaiacd Create Question - Admin

  18. @cmaiacd Create Question - Admin

  19. @cmaiacd Questions - Admin

  20. @cmaiacd Modelo - Poll

  21. @cmaiacd Modelo - Poll

  22. @cmaiacd Modelo - Question

  23. @cmaiacd Modelo - Choice

  24. @cmaiacd Boas Práticas

  25. @cmaiacd • +3 anos • Monolito Django • +230 tabelas

    • +2200 arquivos relevantes • +75k linhas relevantes de Minha Experiência
  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
  27. @cmaiacd Factories ruins são como vírus

  28. @cmaiacd 1. FACTORIES DEVEM REPRESENTAR SEUS MODELOS

  29. @cmaiacd RUIM ❌

  30. @cmaiacd BOM ✅

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

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

  34. @cmaiacd BOM ✅

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

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

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

  38. @cmaiacd BOM ✅

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

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

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

  43. @cmaiacd BOM ✅

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

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

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

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

  48. @cmaiacd 6. FIXTURES APENAS COMO WRAPPERS

  49. @cmaiacd BOM ✅

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

  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
  52. @cmaiacd Código Código

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

  56. @cmaiacd Sobre Faker