apply_user_properties_to_junit.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env python3
  2. import json
  3. import os
  4. import argparse
  5. import xml.etree.ElementTree as ET
  6. from xml.dom import minidom
  7. def add_properties_to_testcases(root, all_properties):
  8. # Iterate over every testsuite tag
  9. for testsuite in root.findall('testsuite'):
  10. directory_name = testsuite.attrib.get('name')
  11. # Iterate over every testcase tag
  12. for testcase in testsuite.findall('testcase'):
  13. testcase_full_name = testcase.attrib.get('name')
  14. # Attempt to split the test name into components
  15. parts = testcase_full_name.split(".", 2)
  16. if len(parts) == 3:
  17. file_name = ".".join(parts[:2])
  18. test_name = ".".join(parts[2:])
  19. full_test_path = os.path.join(directory_name, file_name)
  20. # Check if the full test path and test name exist in all_properties
  21. if full_test_path in all_properties and test_name in all_properties[full_test_path]:
  22. properties_to_add = all_properties[full_test_path][test_name]
  23. # Find or create <properties>
  24. properties_elem = testcase.find('properties')
  25. if properties_elem is None:
  26. properties_elem = ET.SubElement(testcase, 'properties')
  27. # Add properties if not already present
  28. for prop_name, prop_value in properties_to_add.items():
  29. exists = False
  30. for prop in properties_elem.findall('property'):
  31. if prop.attrib.get('name') == prop_name:
  32. exists = True
  33. break
  34. if not exists:
  35. ET.SubElement(properties_elem, 'property', name=prop_name, value=prop_value)
  36. def load_all_properties(test_dir):
  37. all_properties = {}
  38. for dirpath, _, filenames in os.walk(test_dir):
  39. for filename in filenames:
  40. properties_file_path = os.path.abspath(os.path.join(dirpath, filename))
  41. if os.path.isfile(properties_file_path):
  42. with open(properties_file_path, "r") as upf:
  43. properties = json.load(upf)
  44. # Merge properties into all_properties
  45. for key, value in properties.items():
  46. if key not in all_properties:
  47. all_properties[key] = value
  48. else:
  49. all_properties[key].update(value)
  50. return all_properties
  51. def update_junit(test_dir, junit_file, out_file):
  52. tree = ET.parse(junit_file)
  53. root = tree.getroot()
  54. all_properties = load_all_properties(test_dir)
  55. add_properties_to_testcases(root, all_properties)
  56. xml_str = ET.tostring(root, 'utf-8')
  57. parsed_str = minidom.parseString(xml_str)
  58. pretty_xml_str = parsed_str.toprettyxml()
  59. with open(out_file, 'w', encoding='utf-8') as f:
  60. f.write(pretty_xml_str)
  61. def main():
  62. parser = argparse.ArgumentParser()
  63. parser.add_argument('--test_dir')
  64. parser.add_argument("--in_file", type=str)
  65. parser.add_argument("--out_file", type=str)
  66. args = parser.parse_args()
  67. update_junit(args.test_dir, args.in_file, args.out_file)
  68. if __name__ == "__main__":
  69. main()