code: def testGetArtifactsByIdsSuccessfullyReadsAndDeserializes(self):
      original_artifact = _create_tfx_artifact(
          uri="a/b/c", state=types.artifact.ArtifactState.PENDING
      )
      original_artifact.set_string_custom_property("foo", "bar")
      [artifact_id] = _write_tfx_artifacts(
          self._mlmd_handle, [original_artifact]
      )
      [actual_artifact] = artifact_lib.get_artifacts_by_ids(
          self._mlmd_handle, [artifact_id]
      )
      self.assertIsInstance(actual_artifact, types.Artifact)
      self.assertEqual(actual_artifact.uri, "a/b/c")
      self.assertEqual(actual_artifact.id, artifact_id)
      self.assertEqual(
          actual_artifact.state, types.artifact.ArtifactState.PENDING
      )
      self.assertEqual(
          actual_artifact.get_string_custom_property("foo"), "bar"
      )
  
file_path: tfx/tfx/orchestration/portable/mlmd/artifact_lib_test.py
imports: from typing import Optional, Sequence
  import tensorflow
  from tfx import types
  from tfx.orchestration import metadata
  from tfx.orchestration.portable.mlmd import artifact_lib
  from tfx.types import standard_artifacts
  from tfx.utils import test_case_utils
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the ArtifactLibTest obj's underlying member method code with example usage: obj.testGetArtifactsByIdsSuccessfullyReadsAndDeserializes() without return types