python runtime_error ai_generated true

ERROR: tearDown (tests.test_db.TestDB.test_insert) Traceback (most recent call last): File "test_db.py", line 42, in tearDown self.conn.close() AttributeError: 'NoneType' object has no attribute 'close'

ID: python/unittest-teardown-exception-masks-failure

Also available as: JSON · Markdown · 中文
80%Fix Rate
88%Confidence
0Evidence
2024-11-30First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
3.9 active — — —
3.12 active — — —

Root Cause

setUp failed or was skipped, leaving self.conn unset, but tearDown still runs and raises. The teardown error masks the original setup failure.

generic

中文

setUp 失败或被跳过,导致 self.conn 未设置,但 tearDown 仍执行并抛出异常。teardown 错误掩盖了原始的 setup 失败。

Workarounds

  1. 92% success
    Guard teardown with hasattr/getattr:
    
    def tearDown(self):
        conn = getattr(self, 'conn', None)
        if conn is not None:
            conn.close()
  2. 95% success
    Use addCleanup in setUp so cleanup only runs for successfully created resources:
    
    def setUp(self):
        self.conn = create_conn()
        self.addCleanup(self.conn.close)

Dead Ends

Common approaches that don't work:

  1. 85% fail

    Silences real teardown errors and leaks resources, hiding the root cause of future failures.

  2. 80% fail

    Leaves DB connections and temp files open across tests, causing flaky failures later.