code: def features_and_columns_match(self, workspace):
      module = workspace.module
      pipeline = workspace.pipeline
      measurements = workspace.measurements
      object_names = [
          x for x in measurements.get_object_names() if x != "Image"
      ]
      features = [
          [
              feature
              for feature in measurements.get_feature_names(object_name)
              if feature not in (MEASUREMENT, IGNORED_MEASUREMENT)
          ]
          for object_name in object_names
      ]
      columns = [
          x
          for x in module.get_measurement_columns(pipeline)
          if x[0] != "Image"
      ]
      self.assertEqual(sum([len(f) for f in features]), len(columns))
      for column in columns:
          index = object_names.index(column[0])
          self.assertTrue(column[1] in features[index])
  
imports: import numpy
  import unittest
  import cellprofiler_core.image
  import cellprofiler_core.measurement
  import cellprofiler_core.module
  from cellprofiler_core.constants.measurement import C_PARENT, GROUP_NUMBER, GROUP_INDEX, COLTYPE_FLOAT, COLTYPE_INTEGER, M_LOCATION_CENTER_X, M_LOCATION_CENTER_Y, FF_PARENT
  import cellprofiler.modules.relateobjects
  import cellprofiler_core.object
  import cellprofiler_core.pipeline
  import cellprofiler_core.preferences
  import cellprofiler_core.workspace
label_desc: Use image node_id 2 for calling the TestRelateObjects obj's underlying member method code with example usage: obj.features_and_columns_match(workspace) without return types