code: def testDo(
      self,
      split_pairs,
      expected_split_pair_names,
      expect_matches,
      identifiers,
      expected_error_regex=None,
      exclude_artifact_splits=False,
  ):
      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,
      )
      fileio.makedirs(output_data_dir)
  
      # The identifier defined here is not actually expected to be unique, so that
      # we get output, but the rate of collision should be low enough to not blow
      # up the pipeline.
      config = text_format.Parse(
          """
        paired_example_skew: {
          identifier_features: 'company'
          skew_sample_size: 10
          allow_duplicate_identifiers: true
        }
      """,
          example_diff_pb2.ExampleDiffConfig(),
      )
      for identifier in identifiers:
          config.paired_example_skew.identifier_features.append(
              identifier
          )
  
      # Create input dict.
      examples = standard_artifacts.Examples()
      examples.uri = os.path.join(source_data_dir, "csv_example_gen")
      if not exclude_artifact_splits:
          examples.split_names = artifact_utils.encode_split_names(
              ["train", "eval"]
          )
  
      input_dict = {
          standard_component_specs.EXAMPLES_KEY: [examples],
          standard_component_specs.BASELINE_EXAMPLES_KEY: [examples],
      }
  
      exec_properties = {
          # List needs to be serialized before being passed into Do function.
          standard_component_specs.INCLUDE_SPLIT_PAIRS_KEY: json_utils.dumps(
              split_pairs
          ),
          standard_component_specs.EXAMPLE_DIFF_CONFIG_KEY: config,
      }
  
      # Create output dict.
      example_diff = standard_artifacts.ExamplesDiff()
      example_diff.uri = output_data_dir
      output_dict = {
          standard_component_specs.EXAMPLE_DIFF_RESULT_KEY: [
              example_diff
          ],
      }
  
      # Run executor.
      example_diff_executor = executor.Executor()
      if expected_error_regex:
          with self.assertRaisesRegex(ValueError, expected_error_regex):
              example_diff_executor.Do(
                  input_dict, output_dict, exec_properties
              )
      else:
          example_diff_executor.Do(
              input_dict, output_dict, exec_properties
          )
  
      # See tensorflow_data_validation/skew/feature_skew_detector_test.py for
      # detailed examples of feature skew pipeline output.
      for split_pair_name in expected_split_pair_names:
          output_dir = os.path.join(
              example_diff.uri, "SplitPair-" + split_pair_name
          )
          self._validate_skew_pairs(output_dir, expect_matches)
          self._validate_skew_results(output_dir, expect_matches)
          self._validate_match_stats(output_dir)
          # Validate that no additional skew pairs exist.
          all_outputs = fileio.glob(
              os.path.join(example_diff.uri, "SplitPair-*")
          )
          for output in all_outputs:
              split_pair = output.split("SplitPair-")[1]
              self.assertIn(split_pair, expected_split_pair_names)
  
imports: import os
  import tempfile
  from absl.testing import absltest
  from absl.testing import parameterized
  import tensorflow_data_validation
  from tensorflow_data_validation.skew import feature_skew_detector
  from tfx.components.example_diff import executor
  from tfx.dsl.io import fileio
  from tfx.proto import example_diff_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 google.protobuf import text_format
label_desc: Use image node_id 5 for calling the ExecutorTest obj's underlying member method code with example usage: obj.testDo(split_pairs, expected_split_pair_names, expect_matches, identifiers, expected_error_regex, exclude_artifact_splits) without return types