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

factory_boy: Testando Objetos Complexos Python ...

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 Quem sou eu? Desenvolvedora Backend 10+ anos xp 👵

    Python 🐍 e Ruby 💎 OpenSource e Comunidades ❤ Organização de eventos
  2. @cmaiacd • Ferramenta que substitui fixtures • Baseada no factory_bot

    (Thoughtbot) • Primeira versão: só Django • Atualmente: independe de framework • Unittest, Pytest...
  3. @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
  4. @cmaiacd Possui muitas ferramentas que auxiliam na criação dos testes:

    • Sequence • Fuzzy attributes • Faker • LazyFunction • LazyAttribute • Herança • Params • Traits • Strategies • RelatedFactory/SubFactory
  5. @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
  6. @cmaiacd • +3 anos • Monolito Django • +230 tabelas

    • +2200 arquivos relevantes • +75k linhas relevantes de Minha Experiência
  7. @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
  8. @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
  9. @cmaiacd Se o campo é nullable (null=True) o atributo deve

    estar em uma trait e não como valor default
  10. @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.
  11. @cmaiacd BUILD STRATEGY ======================== 14 passed in 1.76 seconds =========================

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

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

    primeira factory • RelatedFactory: build/create depois da criação da primeira factory.
  14. @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
  15. @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
  16. @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