code: def testDoValidation(self, exec_properties, blessed, has_baseline):
      source_data_dir = os.path.join(
          os.path.dirname(os.path.dirname(__file__)), "testdata"
      )
      output_data_dir = os.path.join(
          os.environ.get(
              "TEST_UNDECLARED_OUTPUTS_DIR", self.get_temp_dir()
          ),
          self._testMethodName,
      )
  
      # Create input dict.
      examples = standard_artifacts.Examples()
      examples.uri = os.path.join(source_data_dir, "csv_example_gen")
      examples.split_names = artifact_utils.encode_split_names(
          ["train", "eval"]
      )
      model = standard_artifacts.Model()
      baseline_model = standard_artifacts.Model()
      model.uri = os.path.join(source_data_dir, "trainer/current")
      baseline_model.uri = os.path.join(
          source_data_dir, "trainer/previous/"
      )
      blessing_output = standard_artifacts.ModelBlessing()
      blessing_output.uri = os.path.join(
          output_data_dir, "blessing_output"
      )
      schema = standard_artifacts.Schema()
      schema.uri = os.path.join(source_data_dir, "schema_gen")
      input_dict = {
          standard_component_specs.EXAMPLES_KEY: [examples, examples],
          standard_component_specs.MODEL_KEY: [model],
          standard_component_specs.SCHEMA_KEY: [schema],
      }
      if has_baseline:
          input_dict[standard_component_specs.BASELINE_MODEL_KEY] = [
              baseline_model
          ]
  
      # Create output dict.
      eval_output = standard_artifacts.ModelEvaluation()
      eval_output.uri = os.path.join(output_data_dir, "eval_output")
      blessing_output = standard_artifacts.ModelBlessing()
      blessing_output.uri = os.path.join(
          output_data_dir, "blessing_output"
      )
      output_dict = {
          standard_component_specs.EVALUATION_KEY: [eval_output],
          standard_component_specs.BLESSING_KEY: [blessing_output],
      }
  
      # List needs to be serialized before being passed into Do function.
      exec_properties[
          standard_component_specs.EXAMPLE_SPLITS_KEY
      ] = json_utils.dumps(None)
  
      # Run executor.
      evaluator = executor.Executor()
      evaluator.Do(input_dict, output_dict, exec_properties)
  
      # Check evaluator outputs.
      self.assertTrue(
          fileio.exists(
              os.path.join(eval_output.uri, "eval_config.json")
          )
      )
      self.assertNotEmpty(
          glob.glob(f"{eval_output.uri}/metrics-*.tfrecord")
      )
      self.assertNotEmpty(
          glob.glob(f"{eval_output.uri}/plots-*.tfrecord")
      )
      self.assertTrue(
          fileio.exists(
              os.path.join(eval_output.uri, "validations.tfrecord")
          )
      )
      if blessed:
          self.assertTrue(
              fileio.exists(
                  os.path.join(blessing_output.uri, "BLESSED")
              )
          )
      else:
          self.assertTrue(
              fileio.exists(
                  os.path.join(blessing_output.uri, "NOT_BLESSED")
              )
          )
  
imports: import glob
  import os
  from absl import logging
  from absl.testing import parameterized
  import tensorflow
  import tensorflow_model_analysis
  from tfx.components.evaluator import executor
  from tfx.components.testdata.module_file import evaluator_module
  from tfx.dsl.io import fileio
  from tfx.proto import evaluator_pb2
  from tfx.types import artifact_utils
  from tfx.types import standard_artifacts
  from tfx.types import standard_component_specs
  from tfx.utils import json_utils
  from tfx.utils import proto_utils
label_desc: Use image node_id 3 for calling the ExecutorTest obj's underlying member method code with example usage: obj.testDoValidation(exec_properties, blessed, has_baseline) without return types