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

Python Floripa

June 26, 2021
Tweet

More Decks by Python Floripa

Other Decks in Programming

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
  3. @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
  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 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
  6. @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
  7. @cmaiacd Se o campo é nullable (null=True) o atributo deve

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

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

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

    primeira factory • RelatedFactory: build/create depois da criação da primeira factory.
  12. @cmaiacd • Muitos testes dependendo da mesma fixtures • Tende

    a inflar a fixture • Difícil de manter • Altera a fixture => quebra muitos testes
  13. @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
  14. @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