code: def test_ObservationDataEq(self) -> None:
      od1 = ObservationData(
          metric_names=["a", "b"],
          means=np.array([4.0, 5.0]),
          covariance=np.array([[1.0, 4.0], [3.0, 6.0]]),
      )
      od2 = ObservationData(
          metric_names=["a", "b"],
          means=np.array([4.0, 5.0]),
          covariance=np.array([[1.0, 4.0], [3.0, 6.0]]),
      )
      od3 = ObservationData(
          metric_names=["a", "b"],
          means=np.array([4.0, 5.0]),
          covariance=np.array([[2.0, 4.0], [3.0, 6.0]]),
      )
      self.assertEqual(od1, od2)
      self.assertNotEqual(od1, od3)
      self.assertFalse(od1 == 1)
  
imports: import json
  from unittest.mock import Mock, PropertyMock
  import numpy
  import pandas
  from ax.core.arm import Arm
  from ax.core.base_trial import TrialStatus
  from ax.core.batch_trial import BatchTrial
  from ax.core.data import Data
  from ax.core.generator_run import GeneratorRun
  from ax.core.map_data import MapData, MapKeyInfo
  from ax.core.observation import Observation, ObservationData, ObservationFeatures, observations_from_data, observations_from_map_data, recombine_observations, separate_observations
  from ax.core.trial import Trial
  from ax.utils.common.testutils import TestCase
label_desc: Use image node_id 7 for calling the ObservationsTest obj's underlying member method code with example usage: obj.test_ObservationDataEq() without return types