Start here. This is the direct spoken answer to practice first.
Overview
Uses parametrization for one behavior across meaningful cases while keeping failures and intent easy to read.
I parametrize when the same behavior and assertions should run for several inputs and expected outcomes. Each row should represent a meaningful case such as a boundary, equivalence class, or known regression. I give complex rows descriptive ids so a failure says more than an index. If rows need different workflows or unrelated assertions, I split them into separate tests.