# -*- coding: utf-8 -*- """ tests.support.generate-from-names-from-failed-test-reports ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This script is meant as a stop-gap until we move to PyTest to provide a functionality similar to PyTest's --last-failed where PyTest only runs last failed tests. """ # pylint: disable=resource-leakage from __future__ import absolute_import, print_function, unicode_literals import argparse import glob import os import sys try: import xunitparser except ImportError: sys.stderr.write( "Please install the xunitparser python package to run this script\n" ) sys.stderr.flush() sys.exit(1) REPO_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) def main(): parser = argparse.ArgumentParser() parser.add_argument( "--reports-dir", default=os.path.join(REPO_ROOT, "artifacts", "xml-unittests-output"), help="Path to the directory where the JUnit XML reports can be found", ) parser.add_argument( "output_file", help="Path to the file containing the failed tests listing to be fed to --names-files", ) options = parser.parse_args() total_xml_reports = 0 failures = set() for fname in sorted(glob.glob(os.path.join(options.reports_dir, "*.xml"))): total_xml_reports += 1 with open(fname) as rfh: test_suite, test_result = xunitparser.parse(rfh) if not test_result.errors and not test_result.failures: continue for test in test_suite: if test.bad: failures.add("{classname}.{methodname}".format(**test.__dict__)) if not total_xml_reports: parser.exit(status=1, message="No JUnit XML files were parsed") with open(options.output_file, "w") as wfh: wfh.write(os.linesep.join(sorted(failures))) parser.exit(status=0) if __name__ == "__main__": main()