Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
330
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
11
Minha Jornada em Developer Experience (DX) - DevOpsDays Salvador 2024
camilamaia
0
14
Cumbuca Dev: Ensinando com Open Source - 71º Python Floripa no MeLi
camilamaia
0
49
COMO E PORQUE ENSINAR A PROGRAMAR COM OPEN SOURCE - Python Brasil 2023
camilamaia
0
40
Como testar e manter APIs de qualidade - Codecon Digital 2023
camilamaia
0
320
factory_boy: testing like a pro. DjangoCon US 2022
camilamaia
0
300
ScanAPI Workshop. DjangoCon EU 2022
camilamaia
0
250
Como testar e documentar REST APIs com ScanAPI - Agile Testers Conference 2021
camilamaia
0
190
factory_boy: Testando Objetos Complexos Python Brasil 2021
camilamaia
0
300
Other Decks in Technology
See All in Technology
2024.02.19 W&B AIエージェントLT会 / AIエージェントが業務を代行するための計画と実行 / Algomatic 宮脇
smiyawaki0820
13
3.2k
管理者しか知らないOutlookの裏側のAIを覗く#AzureTravelers
hirotomotaguchi
2
350
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
720
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
130
組織貢献をするフリーランスエンジニアという生き方
n_takehata
1
1.3k
PL900試験から学ぶ Power Platform 基礎知識講座
kumikeyy
0
130
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
700
Classmethod AI Talks(CATs) #16 司会進行スライド(2025.02.12) / classmethod-ai-talks-aka-cats_moderator-slides_vol16_2025-02-12
shinyaa31
0
100
目の前の仕事と向き合うことで成長できる - 仕事とスキルを広げる / Every little bit counts
soudai
24
7k
Moved to https://speakerdeck.com/toshihue/presales-engineer-career-bridging-tech-biz-ja
toshihue
2
740
レビューを増やしつつ 高評価維持するテクニック
tsuzuki817
1
690
PHPカンファレンス名古屋-テックリードの経験から学んだ設計の教訓
hayatokudou
0
220
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
GitHub's CSS Performance
jonrohan
1030
460k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
A better future with KSS
kneath
238
17k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
440
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Unsuck your backbone
ammeep
669
57k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Thoughts on Productivity
jonyablonski
69
4.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
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