def test_read_junit(self):
        try:
            rootdir = tempfile.mkdtemp()

            result_file = os.path.join(rootdir, 'test1.xml')
            with open(result_file, 'w') as fhand:
                fhand.write('<testsuites tests="5" failures="3" errors="1" time="35" name="AllTests"></testsuites>')
            (num_tests, num_errors, num_failures) = catkin_test_results.read_junit(result_file)
            self.assertEqual((5, 1, 3), (num_tests, num_errors, num_failures))
        finally:
            shutil.rmtree(rootdir)
Beispiel #2
0
    def test_read_junit(self):
        try:
            rootdir = tempfile.mkdtemp()

            result_file = os.path.join(rootdir, 'test1.xml')
            with open(result_file, 'w') as fhand:
                fhand.write(
                    '<testsuites tests="5" failures="3" errors="1" time="35" name="AllTests"></testsuites>'
                )
            (num_tests, num_errors,
             num_failures) = catkin_test_results.read_junit(result_file)
            self.assertEqual((5, 1, 3), (num_tests, num_errors, num_failures))
        finally:
            shutil.rmtree(rootdir)
Beispiel #3
0
def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser(
        description=
        'Runs the test command passed as an argument and verifies that the expected result file has been generated.'
    )
    parser.add_argument('results', help='The path to the xunit result file')
    parser.add_argument('command',
                        nargs='+',
                        help='The test command to execute')
    parser.add_argument('--working-dir',
                        nargs='?',
                        help='The working directory for the executed command')
    parser.add_argument(
        '--return-code',
        action='store_true',
        default=False,
        help='Set the return code based on the success of the test command')
    args = parser.parse_args(argv)

    # if result file exists remove it before test execution
    if os.path.exists(args.results):
        os.remove(args.results)
    # if placeholder (indicating previous failure) exists remove it before test execution
    placeholder = os.path.join(os.path.dirname(args.results),
                               'MISSING-%s' % os.path.basename(args.results))
    if os.path.exists(placeholder):
        os.remove(placeholder)

    work_dir_msg = ' with working directory "%s"' % args.working_dir if args.working_dir is not None else ''
    cmds_msg = ''.join(['\n  %s' % cmd for cmd in args.command])
    print('-- run_tests.py: execute commands%s%s' % (work_dir_msg, cmds_msg))

    rc = 0
    for cmd in args.command:
        rc = subprocess.call(cmd, cwd=args.working_dir, shell=True)
        if rc:
            break

    print('-- run_tests.py: verify result "%s"' % args.results)

    if os.path.exists(args.results):
        # if result file exists ensure that it contains valid xml
        tree = None
        try:
            tree = ElementTree(None, args.results)
        except ParseError:
            #print('Invalid XML in result file "%s"' % args.results)
            tidy_xml(args.results)
            try:
                tree = ElementTree(None, args.results)
            except ParseError as e:
                print(
                    'Invalid XML in result file "%s" (even after trying to tidy it): %s '
                    % (args.results, str(e)),
                    file=sys.stderr)
                rc = 1
        if tree:
            _, num_errors, num_failures = read_junit(args.results)
            if num_errors or num_failures:
                rc = 1
    else:
        rc = 1
        # if result file does not exist create placeholder which indicates failure
        print('Cannot find results, writing failure results to "%s"' %
              placeholder,
              file=sys.stderr)
        # create folder if necessary
        if not os.path.exists(os.path.dirname(args.results)):
            os.makedirs(os.path.dirname(args.results))
        with open(placeholder, 'w') as f:
            data = {
                'test': os.path.basename(args.results),
                'test_file': args.results
            }
            f.write('''<?xml version="1.0" encoding="UTF-8"?>
<testsuite tests="1" failures="1" time="1" errors="0" name="%(test)s">
  <testcase name="test_ran" status="run" time="1" classname="Results">
    <failure message="Unable to find test results for %(test)s, test did not run.\nExpected results in %(test_file)s" type=""/>
  </testcase>
</testsuite>''' % data)

    if args.return_code:
        return rc
    return 0
def main(argv=sys.argv[1:]):
    parser = argparse.ArgumentParser(description='Runs the test command passed as an argument and verifies that the expected result file has been generated.')
    parser.add_argument('results', help='The path to the xunit result file')
    parser.add_argument('command', nargs='+', help='The test command to execute')
    parser.add_argument('--working-dir', nargs='?', help='The working directory for the executed command')
    parser.add_argument('--return-code', action='store_true', default=False, help='Set the return code based on the success of the test command')
    args = parser.parse_args(argv)

    # if result file exists remove it before test execution
    if os.path.exists(args.results):
        os.remove(args.results)
    # if placeholder (indicating previous failure) exists remove it before test execution
    placeholder = os.path.join(os.path.dirname(args.results), 'MISSING-%s' % os.path.basename(args.results))
    if os.path.exists(placeholder):
        os.remove(placeholder)

    work_dir_msg = ' with working directory "%s"' % args.working_dir if args.working_dir is not None else ''
    cmds_msg = ''.join(['\n  %s' % cmd for cmd in args.command])
    print('-- run_tests.py: execute commands%s%s' % (work_dir_msg, cmds_msg))

    rc = 0
    for cmd in args.command:
        rc = subprocess.call(cmd, cwd=args.working_dir, shell=True)
        if rc:
            break

    print('-- run_tests.py: verify result "%s"' % args.results)

    if os.path.exists(args.results):
        # if result file exists ensure that it contains valid xml
        tree = None
        try:
            tree = ElementTree(None, args.results)
        except ParseError:
            #print('Invalid XML in result file "%s"' % args.results)
            tidy_xml(args.results)
            try:
                tree = ElementTree(None, args.results)
            except ParseError as e:
                print('Invalid XML in result file "%s" (even after trying to tidy it): %s ' % (args.results, str(e)), file=sys.stderr)
                rc = 1
        if tree:
            _, num_errors, num_failures = read_junit(args.results)
            if num_errors or num_failures:
                rc = 1
    else:
        rc = 1
        # if result file does not exist create placeholder which indicates failure
        print('Cannot find results, writing failure results to "%s"' % placeholder, file=sys.stderr)
        # create folder if necessary
        if not os.path.exists(os.path.dirname(args.results)):
            try:
                os.makedirs(os.path.dirname(args.results))
            except OSError as e:
                # catch case where folder has been created in the mean time
                if e.errno != errno.EEXIST:
                    raise
        with open(placeholder, 'w') as f:
            data = {'test': os.path.basename(args.results), 'test_file': args.results}
            f.write('''<?xml version="1.0" encoding="UTF-8"?>
<testsuite tests="1" failures="1" time="1" errors="0" name="%(test)s">
  <testcase name="test_ran" status="run" time="1" classname="Results">
    <failure message="Unable to find test results for %(test)s, test did not run.\nExpected results in %(test_file)s" type=""/>
  </testcase>
</testsuite>''' % data)

    if args.return_code:
        return rc
    return 0