Start here. This is the direct spoken answer to practice first.
Overview
Explains pytest fixture dependency resolution, caching, lifetime, and the isolation cost of wider scopes.
A pytest test requests fixtures by naming them as parameters, and a fixture can request other fixtures the same way. Pytest resolves that dependency graph, creates each fixture once within its scope, and reuses its value for requests inside that scope. I default to function scope because every test gets fresh state. I widen scope only for expensive resources that are safe to share.