Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
factory_boy: testing like a pro. DjangoCon EU 2022
Search
Camila Maia
September 22, 2022
Technology
1
810
factory_boy: testing like a pro. DjangoCon EU 2022
https://pretalx.evolutio.pt/djangocon-europe-2022/talk/XWUYA8/
Camila Maia
September 22, 2022
Tweet
Share
More Decks by Camila Maia
See All by Camila Maia
GitHub Actions - Semana DevOps LINUXTips.pdf
camilamaia
0
40
Minha Jornada em Developer Experience (DX) - DevOpsDays Salvador 2024
camilamaia
0
31
Cumbuca Dev: Ensinando com Open Source - 71º Python Floripa no MeLi
camilamaia
0
65
COMO E PORQUE ENSINAR A PROGRAMAR COM OPEN SOURCE - Python Brasil 2023
camilamaia
0
49
Como testar e manter APIs de qualidade - Codecon Digital 2023
camilamaia
0
1.1k
factory_boy: testing like a pro. DjangoCon US 2022
camilamaia
0
790
ScanAPI Workshop. DjangoCon EU 2022
camilamaia
0
690
Como testar e documentar REST APIs com ScanAPI - Agile Testers Conference 2021
camilamaia
0
380
factory_boy: Testando Objetos Complexos Python Brasil 2021
camilamaia
0
490
Other Decks in Technology
See All in Technology
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
『星の世界の地図の話: Google Sky MapをAI Agentでよみがえらせる』 - Google Developers DevFest Tokyo 2025
taniiicom
0
450
SRE視点で振り返るメルカリのアーキテクチャ変遷と普遍的な考え
foostan
2
3.7k
Capture Checking / Separation Checking 入門
tanishiking
0
110
IPv6-mostly field report from RubyKaigi 2026
sorah
0
240
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
9.8k
翻訳・対話・越境で強いチームワークを作ろう! / Building Strong Teamwork through Interpretation, Dialogue, and Border-Crossing
ar_tama
4
840
Pandocでmd→pptx便利すぎワロタwww
meow_noisy
2
1.1k
Introduction to Bill One Development Engineer
sansan33
PRO
0
320
AIにおける自由の追求
shujisado
1
380
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
21k
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
46k
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
66k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Typedesign – Prime Four
hannesfritz
42
2.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
The Cult of Friendly URLs
andyhume
79
6.7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Writing Fast Ruby
sferik
630
62k
Transcript
@cmaiacd factory_boy DjangoCon EU 2022 - Porto Camila Maia
testing like a pro
@cmaiacd You can find this presentation at: speakerdeck.com/cmaiacd
@cmaiacd Who am I?
@cmaiacd Backend Developer @
@cmaiacd Brazilian
@cmaiacd Living in Berlin
@cmaiacd Queer
@cmaiacd 🐶
@cmaiacd Coding since 2010 👵
@cmaiacd Python 🐍 and Ruby 💎
@cmaiacd Community ❤
@cmaiacd Conferences
@cmaiacd Open Source ❤
@cmaiacd Creator of ScanAPI
@cmaiacd +1.5k + 1.2k ⭐
@cmaiacd Workshop Tomorrow 4:55 PM
@cmaiacd
@cmaiacd factory_boy: what is it?
@cmaiacd It is a fixtures replacement
@cmaiacd Based on factory_bot (Thoughtbot)
@cmaiacd First version: Django only Nowadays: framework-independent Unittest, Pytest...
@cmaiacd For complex objects: ❌ Fixtures: static, hard to maintain
✅ Factories: easy-to-use
@cmaiacd
@cmaiacd 🧰 🛠 🔧 ⚙ Sequence Faker Fuzzy attributes LazyFunction
LazyAttribute Inheritance Inheritance Params Traits Strategies RelatedFactory / SubFactory
@cmaiacd My Experience
@cmaiacd +3 years Django Monolith 🐘
@cmaiacd +230 tables +2200 relevant files +75k relevant lines
@cmaiacd
@cmaiacd A poorly designed factory might affect many tests
@cmaiacd Implicit errors
@cmaiacd The tests are created in a way to fit
the factory factory-oriented testing
@cmaiacd Factories can get too tied
@cmaiacd Developers bump into the same issue again and again
@cmaiacd Patterns 👀 Best practices? 🤔
@cmaiacd Demo App
@cmaiacd Polls
@cmaiacd Poll
@cmaiacd Results
@cmaiacd s
@cmaiacd Model - 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
@cmaiacd Model - Poll
@cmaiacd Model - Poll
@cmaiacd Model - Question
@cmaiacd Model - Choice
@cmaiacd Best Practices
@cmaiacd 1. FACTORIES SHOULD REPRESENT THEIR MODELS
@cmaiacd Avoid implicit errors
@cmaiacd BAD ❌
@cmaiacd GOOD ✅
@cmaiacd 2. DO NOT RELY ON DEFAULTS FROM FACTORIES
@cmaiacd • If a default value is changed, all tests
that depend on it will break • The setup of a test should contain all the logic to ensure it will always pass • Explicit better than implicit
@cmaiacd BAD ❌
@cmaiacd GOOD ✅
@cmaiacd 3. FACTORIES SHOULD CONTAIN ONLY THE REQUIRED DATA
@cmaiacd If the field is nullable (null=True) the attribute should
be under a trait and not as a default value
@cmaiacd BAD ❌
@cmaiacd GOOD ✅
@cmaiacd If we want to have an author, we can
use PollFactory(with_author=True) now When are we going to remember to test the case PollFactory(author=None)? We should not assume there is an author when DB actually allows to not have it.
@cmaiacd 4. BUILD OVER CREATE
@cmaiacd MyFactory.build() creates a local object (memory) MyFactory.create() creates a
local object + stores it in the DB
@cmaiacd BAD ❌
@cmaiacd GOOD ✅
@cmaiacd BUILD STRATEGY ========== 14 passed in 1.76 seconds ==========
CREATE STRATEGY ========== 14 passed in 3.26 seconds ==========
@cmaiacd 5. IF FK IS IN THE TABLE: SUBFACTOR IF
FK IS IN THE OTHER TABLE: RELATEDFACTORY + TRAIT
@cmaiacd SubFactory: builds/creates the SubFactory during the process of creation
of the main factory RelatedFactory: builds/creates the RelatedFactory after creating the main factory
@cmaiacd Good ✅
@cmaiacd 6. USE FIXTURES TO WRAP FACTORIES TO AVOID DUPLICATION
@cmaiacd BAD ❌
@cmaiacd GOOD ✅
@cmaiacd 7. AVOID SHARING FACTORIES OR FIXTURES AMONG DIFFERENT FILES
@cmaiacd Many tests depending on the same factory/fixture
@cmaiacd Tends to inflate the factory/fixture
@cmaiacd Hard to maintain
@cmaiacd Change a factory/fixture… tons of tests breaking
@cmaiacd Fixture / Factory oriented testing
@cmaiacd Ok, ok, I got it! 😌 Now I know
the best practices 💪
@cmaiacd So let’s try to fix one first factory… 🤓
@cmaiacd
@cmaiacd Baby steps 🐣
@cmaiacd Código
@cmaiacd Official doc 📄 factoryboy.readthedocs.io
@cmaiacd Common recipes factoryboy.readthedocs.io/ en/stable/recipes.html
@cmaiacd Code github.com/FactoryBoy/ factory_boy
@cmaiacd THANK YOU! MUITO OBRIGADA! @cmaiacd camilamaia cmaiacd.com