# AttributeError: 'TestUser' object has no attribute 'db'

- **ID:** `python/unittest-teardown-attribute-error`
- **Domain:** python
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

setUpClass or setUp failed silently (or was misspelled) so the attribute assigned in setUp is never created, but tearDown still references it.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| 3.9 | active | — | — |
| 3.10 | active | — | — |
| 3.11 | active | — | — |
| 3.12 | active | — | — |

## Workarounds

1. **** (85% success)
   ```
   class TestUser(unittest.TestCase):
    def setUp(self):
        self.db = connect()

    def tearDown(self):
        if hasattr(self, 'db'):
            self.db.close()
   ```
2. **** (95% success)
   ```
   def setUp(self):
    self.db = connect()
    self.addCleanup(self.db.close)
   ```

## Dead Ends

- **** — Hides the real setup failure; subsequent tests may run against a half-initialized state. (80% fail)
- **** — If setUp is the failing method, referencing the attribute earlier just moves the error. (70% fail)
