One test body, many cases — from a table, a JSON file, or a CSV
parametrize runs at import, so the data must exist by then. (JSON file = no // comments.)csv.DictReader yields one dict per row, but every value is a string — so "false" is truthy!== "true", or wrap in int(...) — the reader won't do it for you.One body, many rows — from JSON or CSV, each named so failures point at the case