Skip to content

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
└─────────────────────────────────────────────────┘
  • setUpTestData is a class method that
  • setup() is slower than setUpTestData because it runs before each test method, while setUpTestData runs only once for the entire test class.