prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Testsuite fails under pytest==8.2.0 with `'AsyncHTTPTestCase' has no attribute 'runTest'`
  We currently have some test failures in basically all python versions, starting ~2 days ago. At first glance, it looks like an issue with `tornado`'s `AsyncHTTPTestCase`, but `tornado` doesn't have a recent release.
  
  Looking at what projects updated recently, I flagged `pytest` as a good candidate for investigation, and testing with `pytest=8.1.2` works fine. So something related to unittest TestCases changed in 8.2.0 in a way that breaks tornado tests.
  
  For reference, here's one of the error traces:
  ```
  ____________________ ERROR collecting tests/test_tornadoparser.py ____________________
  .tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__
      setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))
  E   AttributeError: 'AsyncHTTPTestCase' object has no attribute 'runTest'
  ____________________ ERROR collecting tests/test_tornadoparser.py ____________________
  .tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__
      setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))
  E   AttributeError: 'TestApp' object has no attribute 'runTest'
  ____________________ ERROR collecting tests/test_tornadoparser.py ____________________
  .tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__
      setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))
  E   AttributeError: 'TestValidateApp' object has no attribute 'runTest'
  ```
  
  `runTest` looks like a dynamically created method in unittest, whose name gets passed on init to TestCase.
  I started looking at changes to `pytest`'s unittest module ( https://github.com/pytest-dev/pytest/blame/main/src/_pytest/unittest.py ), but I'm out of time for digging into this right now.
  
  </issue>
  <code>
  [start of src/webargs/__init__.py]
  1 from __future__ import annotations
  2 
  3 import importlib.metadata
  4 
  5 # Make marshmallow's validation functions importable from webargs
  6 from marshmallow import validate
  7 from marshmallow.utils import missing
  8 from packaging.version import Version
  9 
  10 from webargs import fields
  11 from webargs.core import ValidationError
  12 
  13 # TODO: Deprecate __version__ et al.
  14 __version__ = importlib.metadata.version("webargs")
  15 __parsed_version__ = Version(__version__)
  16 __version_info__: tuple[int, int, int] | tuple[int, int, int, str, int] = (
  17     __parsed_version__.release
  18 )  # type: ignore[assignment]
  19 if __parsed_version__.pre:
  20     __version_info__ += __parsed_version__.pre  # type: ignore[assignment]
  21 __all__ = ("ValidationError", "fields", "missing", "validate")
  22
  [end of src/webargs/__init__.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/src/webargs/__init__.py b/src/webargs/__init__.py
  --- a/src/webargs/__init__.py
  +++ b/src/webargs/__init__.py
  @@ -14,8 +14,8 @@
   __version__ = importlib.metadata.version("webargs")
   __parsed_version__ = Version(__version__)
   __version_info__: tuple[int, int, int] | tuple[int, int, int, str, int] = (
  -    __parsed_version__.release
  -)  # type: ignore[assignment]
  +    __parsed_version__.release  # type: ignore[assignment]
  +)
   if __parsed_version__.pre:
       __version_info__ += __parsed_version__.pre  # type: ignore[assignment]
   __all__ = ("ValidationError", "fields", "missing", "validate")
  
verification_info: {"golden_diff": "diff --git a/src/webargs/__init__.py b/src/webargs/__init__.py\n--- a/src/webargs/__init__.py\n+++ b/src/webargs/__init__.py\n@@ -14,8 +14,8 @@\n __version__ = importlib.metadata.version(\"webargs\")\n __parsed_version__ = Version(__version__)\n __version_info__: tuple[int, int, int] | tuple[int, int, int, str, int] = (\n-    __parsed_version__.release\n-)  # type: ignore[assignment]\n+    __parsed_version__.release  # type: ignore[assignment]\n+)\n if __parsed_version__.pre:\n     __version_info__ += __parsed_version__.pre  # type: ignore[assignment]\n __all__ = (\"ValidationError\", \"fields\", \"missing\", \"validate\")\n", "issue": "Testsuite fails under pytest==8.2.0 with `'AsyncHTTPTestCase' has no attribute 'runTest'`\nWe currently have some test failures in basically all python versions, starting ~2 days ago. At first glance, it looks like an issue with `tornado`'s `AsyncHTTPTestCase`, but `tornado` doesn't have a recent release.\r\n\r\nLooking at what projects updated recently, I flagged `pytest` as a good candidate for investigation, and testing with `pytest=8.1.2` works fine. So something related to unittest TestCases changed in 8.2.0 in a way that breaks tornado tests.\r\n\r\nFor reference, here's one of the error traces:\r\n```\r\n____________________ ERROR collecting tests/test_tornadoparser.py ____________________\r\n.tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__\r\n    setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))\r\nE   AttributeError: 'AsyncHTTPTestCase' object has no attribute 'runTest'\r\n____________________ ERROR collecting tests/test_tornadoparser.py ____________________\r\n.tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__\r\n    setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))\r\nE   AttributeError: 'TestApp' object has no attribute 'runTest'\r\n____________________ ERROR collecting tests/test_tornadoparser.py ____________________\r\n.tox/py311/lib/python3.11/site-packages/tornado/testing.py:180: in __init__\r\n    setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))\r\nE   AttributeError: 'TestValidateApp' object has no attribute 'runTest'\r\n```\r\n\r\n`runTest` looks like a dynamically created method in unittest, whose name gets passed on init to TestCase.\r\nI started looking at changes to `pytest`'s unittest module ( https://github.com/pytest-dev/pytest/blame/main/src/_pytest/unittest.py ), but I'm out of time for digging into this right now.\n", "before_files": [{"content": "from __future__ import annotations\n\nimport importlib.metadata\n\n# Make marshmallow's validation functions importable from webargs\nfrom marshmallow import validate\nfrom marshmallow.utils import missing\nfrom packaging.version import Version\n\nfrom webargs import fields\nfrom webargs.core import ValidationError\n\n# TODO: Deprecate __version__ et al.\n__version__ = importlib.metadata.version(\"webargs\")\n__parsed_version__ = Version(__version__)\n__version_info__: tuple[int, int, int] | tuple[int, int, int, str, int] = (\n    __parsed_version__.release\n)  # type: ignore[assignment]\nif __parsed_version__.pre:\n    __version_info__ += __parsed_version__.pre  # type: ignore[assignment]\n__all__ = (\"ValidationError\", \"fields\", \"missing\", \"validate\")\n", "path": "src/webargs/__init__.py"}]}