code: def testRunWithSameSpec(self, mock_kube_utils):
      _initialize_executed_components()
      mock_kube_utils.is_inside_cluster.return_value = True
  
      component_a = _FakeComponent(
          spec=_FakeComponentSpecA(
              output=types.Channel(type=_ArtifactTypeA)
          )
      )
      component_f1 = _FakeComponent(
          spec=_FakeComponentSpecF(a=component_a.outputs["output"])
      ).with_id("f1")
      component_f2 = _FakeComponent(
          spec=_FakeComponentSpecF(a=component_a.outputs["output"])
      ).with_id("f2")
      component_f2.add_upstream_node(component_f1)
  
      test_pipeline = pipeline.Pipeline(
          pipeline_name="x",
          pipeline_root="y",
          metadata_connection_config=metadata_store_pb2.ConnectionConfig(),
          components=[component_f1, component_f2, component_a],
      )
      kubernetes_dag_runner.KubernetesDagRunner().run(test_pipeline)
      self.assertEqual(
          _executed_components,
          ["a.Wrapper", "f1.Wrapper", "f2.Wrapper"],
      )
  
imports: from unittest import mock
  import tensorflow
  from tfx import types
  from tfx.dsl.components.base import base_component
  from tfx.dsl.components.base import base_executor
  from tfx.dsl.components.base import base_node
  from tfx.dsl.components.base import executor_spec
  from tfx.orchestration import pipeline
  from tfx.orchestration.experimental.kubernetes import kubernetes_dag_runner
  from tfx.types.component_spec import ChannelParameter
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the KubernetesDagRunnerTest obj's underlying member method code with example usage: obj.testRunWithSameSpec(mock_kube_utils) without return types