docstr: Test executor class import under empty inputs/outputs.
docstr_tok: ["Test","executor","class","import","under","empty","inputs\/outputs","."]
code: def testMainEmptyInputs(self):
      """Test executor class import under empty inputs/outputs."""
      inputs = {
          "x": [
              standard_artifacts.ExternalArtifact(),
              standard_artifacts.ExternalArtifact(),
          ]
      }
      outputs = {"y": [standard_artifacts.Examples()]}
      exec_properties = {"a": "b"}
      args = [
          "--executor_class_path=%s"
          % name_utils.get_full_name(FakeExecutor),
          "--inputs=%s" % artifact_utils.jsonify_artifact_dict(inputs),
          "--outputs=%s"
          % artifact_utils.jsonify_artifact_dict(outputs),
          "--exec-properties=%s" % json.dumps(exec_properties),
      ]
      with ArgsCapture() as args_capture:
          run_executor.main(run_executor.parse_flags(args))
          # TODO(b/131417512): Add equal comparison to types.Artifact class so we
          # can use asserters.
          self.assertSetEqual(
              set(args_capture.input_dict.keys()), set(inputs.keys())
          )
          self.assertSetEqual(
              set(args_capture.output_dict.keys()), set(outputs.keys())
          )
          self.assertDictEqual(
              args_capture.exec_properties, exec_properties
          )
  
file_path: tfx/tfx/scripts/run_executor_test.py
imports: import json
  from typing import Any, Dict, List
  import tensorflow
  from tfx import types
  from tfx.dsl.components.base import base_executor
  from tfx.scripts import run_executor
  from tfx.types import artifact_utils
  from tfx.types import standard_artifacts
  from tfx.utils import name_utils
label_desc: Use image node_id 1 for calling the RunExecutorTest obj's underlying member method code with example usage: obj.testMainEmptyInputs() without return types