Django unittest data contamination
setupTestData vs setUp
ASCII Schema fron claude 4.1
plaintext
╔════════════════════════════════════════════════════════════════════════════╗
║ SETUP METHOD EXECUTION TIMING ║
╚════════════════════════════════════════════════════════════════════════════╝
┌─────────────────────┬─────────────────────┬─────────────────────────────┐
│ setUpTestData() │ setUp() │ Key Difference │
├─────────────────────┼─────────────────────┼─────────────────────────────┤
│ │ │ │
│ Class Start │ Class Start │ │
│ ↓ │ ↓ │ │
│ setUpTestData() ◄───┤ (nothing) │ ◄─ Data created once │
│ [Creates data] │ │ │
│ │ │ │ │
│ ├─ test_1() │ ├─ setUp() ◄──────┤ ◄─ Fresh data each time │
│ │ └─ tearDown()│ │ [Creates data] │ │
│ │ └─ rollback │ │ test_1() │ │
│ │ │ │ └─ tearDown() │ │
│ │ │ │ └─ rollback │ ◄─ Rolls back setUp() too │
│ │ │ │ │ │
│ ├─ test_2() │ ├─ setUp() ◄──────┤ ◄─ Fresh data again │
│ │ └─ tearDown()│ │ [Creates data] │ │
│ │ └─ rollback │ │ test_2() │ │
│ │ │ │ └─ tearDown() │ │
│ │ │ │ └─ rollback │ ◄─ Rolls back setUp() too │
│ │ │ │ │ │
│ Class End │ Class End │ │
│ [Data cleaned] │ [Already clean] │ │
│ │ │ │
└─────────────────────┴─────────────────────┴─────────────────────────────┘
setUpTestData() Approach:
═══════════════════════════
┌───────────────── CLASS SCOPE ─────────────────┐
│ setUpTestData() │ ◄─ NO TRANSACTION!
│ ┌─ test_1() ─┐ ┌─ test_2() ─┐ │ (Permanent data)
│ │ [changes] │ │ [changes] │ │
│ └─ rollback ─┘ └─ rollback ─┘ │ ◄─ Only test changes
└───────────────────────────────────────────────┘ are rolled back
setUp() Approach:
══════════════════
┌───────────────── METHOD SCOPE ──────────────────┐
│ ┌──── test_1() ────┐ ┌──── test_2() ────┐ │
│ │ setUp() │ │ setUp() │ │ ◄─ FULL TRANSACTION!
│ │ [creates data] │ │ [creates data] │ │ (Including setup)
│ │ [test changes] │ │ [test changes] │ │
│ └─ FULL rollback ──┘ └─ FULL rollback ──┘ │ ◄─ Everything rolls back
└─────────────────────────────────────────────────┘setUpTestDatais a class method thatsetup()is slower thansetUpTestDatabecause it runs before each test method, whilesetUpTestDataruns only once for the entire test class.