code: def test_pep526_annotations(self):
      # test class attributes annotations
      config = Config(
          napoleon_attr_annotations=True,
      )
      actual = str(
          NumpyDocstring(
              cleandoc(PEP526NumpyClass.__doc__),
              config,
              app=None,
              what="class",
              obj=PEP526NumpyClass,
          )
      )
      expected = """\
  Sample class with PEP 526 annotations and numpy docstring
  
  .. attribute:: attr1
  
     Attr1 description
  
     :type: int
  
  .. attribute:: attr2
  
     Attr2 description
  
     :type: str
  """
      print(actual)
      assert expected == actual
  
imports: import re
  from collections import namedtuple
  from inspect import cleandoc
  from textwrap import dedent
  from unittest import mock
  import pytest
  from sphinx.ext.napoleon import Config
  from sphinx.ext.napoleon.docstring import GoogleDocstring, NumpyDocstring, _convert_numpy_type_spec, _recombine_set_tokens, _token_type, _tokenize_type_spec
  from tests.test_extensions.ext_napoleon_pep526_data_google import PEP526GoogleClass
  from tests.test_extensions.ext_napoleon_pep526_data_numpy import PEP526NumpyClass
label_desc: Use image node_id 25 for calling the TestNumpyDocstring obj's underlying member method code with example usage: obj.test_pep526_annotations() without return types