Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | import argparse |
| 4 | import logging |
| 5 | import os |
| 6 | import sys |
| 7 | import traceback |
| 8 | import warnings |
| 9 | |
| 10 | from reporter import Reporter |
| 11 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 12 | warnings.simplefilter("always", DeprecationWarning) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 13 | logger = logging.getLogger(__name__) |
| 14 | |
| 15 | if sys.version_info[0] == 3: |
| 16 | str_cls = str |
| 17 | else: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 18 | str_cls = eval("unicode") |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 19 | |
| 20 | |
| 21 | def filename(string): |
| 22 | if not os.path.exists(string): |
| 23 | msg = "%r is not exists" % string |
| 24 | raise argparse.ArgumentTypeError(msg) |
| 25 | if not os.path.isfile(string): |
| 26 | msg = "%r is not a file" % string |
| 27 | raise argparse.ArgumentTypeError(msg) |
| 28 | return string |
| 29 | |
| 30 | |
| 31 | def parse_args(args): |
| 32 | defaults = { |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 33 | "TESTRAIL_URL": "https://mirantis.testrail.com", |
| 34 | "TESTRAIL_USER": "user@example.com", |
| 35 | "TESTRAIL_PASSWORD": "password", |
| 36 | "TESTRAIL_PROJECT": "Mirantis OpenStack", |
| 37 | "TESTRAIL_MILESTONE": "9.0", |
| 38 | "TESTRAIL_TEST_SUITE": "[{0.testrail_milestone}] MOSQA", |
| 39 | "XUNIT_REPORT": "report.xml", |
| 40 | "OUTPUT_XUNIT_REPORT": "output_report.xml", |
| 41 | "XUNIT_NAME_TEMPLATE": "{id}", |
| 42 | "TESTRAIL_NAME_TEMPLATE": "{custom_report_label}", |
| 43 | "TRACE_LEN": 100, |
| 44 | "ISO_ID": None, |
| 45 | "TESTRAIL_PLAN_NAME": None, |
| 46 | "ENV_DESCRIPTION": "", |
| 47 | "TEST_RESULTS_LINK": "", |
| 48 | "PASTE_BASE_URL": None, |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 49 | } |
| 50 | defaults = {k: os.environ.get(k, v) for k, v in defaults.items()} |
| 51 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 52 | parser = argparse.ArgumentParser(description="xUnit to testrail reporter") |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 53 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 54 | "xunit_report", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 55 | type=filename, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 56 | default=defaults["XUNIT_REPORT"], |
| 57 | help="xUnit report XML file", |
| 58 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 59 | |
| 60 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 61 | "--output-xunit-report", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 62 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 63 | default=defaults["OUTPUT_XUNIT_REPORT"], |
| 64 | help="Output xUnit report XML file after update", |
| 65 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 66 | |
| 67 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 68 | "--xunit-name-template", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 69 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 70 | default=defaults["XUNIT_NAME_TEMPLATE"], |
| 71 | help="template for xUnit cases to make id string", |
| 72 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 73 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 74 | "--testrail-name-template", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 75 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 76 | default=defaults["TESTRAIL_NAME_TEMPLATE"], |
| 77 | help="template for TestRail cases to make id string", |
| 78 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 79 | |
| 80 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 81 | "--env-description", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 82 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 83 | default=defaults["ENV_DESCRIPTION"], |
| 84 | help="env deploy type description (for TestRun name)", |
| 85 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 86 | |
| 87 | group = parser.add_mutually_exclusive_group() |
| 88 | group.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 89 | "--iso-id", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 90 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 91 | default=defaults["ISO_ID"], |
| 92 | help="id of build Fuel iso (DEPRECATED)", |
| 93 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 94 | group.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 95 | "--testrail-plan-name", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 96 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 97 | default=defaults["TESTRAIL_PLAN_NAME"], |
| 98 | help="name of test plan to be displayed in testrail", |
| 99 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 100 | |
| 101 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 102 | "--test-results-link", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 103 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 104 | default=defaults["TEST_RESULTS_LINK"], |
| 105 | help="link to test job results", |
| 106 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 107 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 108 | "--testrail-url", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 109 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 110 | default=defaults["TESTRAIL_URL"], |
| 111 | help="base url of testrail", |
| 112 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 113 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 114 | "--testrail-user", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 115 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 116 | default=defaults["TESTRAIL_USER"], |
| 117 | help="testrail user", |
| 118 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 119 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 120 | "--testrail-password", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 121 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 122 | default=defaults["TESTRAIL_PASSWORD"], |
| 123 | help="testrail password", |
| 124 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 125 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 126 | "--testrail-project", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 127 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 128 | default=defaults["TESTRAIL_PROJECT"], |
| 129 | help="testrail project name", |
| 130 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 131 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 132 | "--testrail-milestone", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 133 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 134 | default=defaults["TESTRAIL_MILESTONE"], |
| 135 | help="testrail project milestone", |
| 136 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 137 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 138 | "--testrail-suite", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 139 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 140 | default=defaults["TESTRAIL_TEST_SUITE"], |
| 141 | help="testrail project suite name", |
| 142 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 143 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 144 | "--trace-len", |
Ilya Menkov | 9533a89 | 2021-05-12 19:45:51 +0400 | [diff] [blame] | 145 | type=int, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 146 | default=defaults["TRACE_LEN"], |
| 147 | help="testrail project name", |
| 148 | ) |
Ilya Menkov | 9533a89 | 2021-05-12 19:45:51 +0400 | [diff] [blame] | 149 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 150 | "--send-skipped", |
| 151 | action="store_true", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 152 | default=False, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 153 | help="send skipped cases to testrail", |
| 154 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 155 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 156 | "--send-duplicates", |
| 157 | action="store_true", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 158 | default=False, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 159 | help="send duplicated cases to testrail", |
| 160 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 161 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 162 | "--paste-url", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 163 | type=str_cls, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 164 | default=defaults["PASTE_BASE_URL"], |
| 165 | help=( |
| 166 | "pastebin service JSON API URL to send test case logs and trace," |
| 167 | " example: http://localhost:5000/" |
| 168 | ), |
| 169 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 170 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 171 | "--testrail-run-update", |
| 172 | dest="use_test_run_if_exists", |
| 173 | action="store_true", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 174 | default=False, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 175 | help="don't create new test run if such already exists", |
| 176 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 177 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 178 | "--dry-run", |
| 179 | "-n", |
| 180 | action="store_true", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 181 | default=False, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 182 | help="Just print mapping table", |
| 183 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 184 | parser.add_argument( |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 185 | "--verbose", |
| 186 | "-v", |
| 187 | action="store_true", |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 188 | default=False, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 189 | help="Verbose mode", |
| 190 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 191 | |
| 192 | return parser.parse_args(args) |
| 193 | |
| 194 | |
| 195 | def main(args=None): |
| 196 | |
| 197 | args = args or sys.argv[1:] |
| 198 | |
| 199 | args = parse_args(args) |
| 200 | |
| 201 | if not args.testrail_plan_name: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 202 | args.testrail_plan_name = ( |
| 203 | "{0.testrail_milestone} iso " "#{0.iso_id}" |
| 204 | ).format(args) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 205 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 206 | msg = ( |
| 207 | "--iso-id parameter is DEPRECATED. " |
| 208 | "It is recommended to use --testrail-plan-name parameter." |
| 209 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 210 | warnings.warn(msg, DeprecationWarning) |
| 211 | |
| 212 | logger_dict = dict(stream=sys.stderr) |
| 213 | if args.verbose: |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 214 | logger_dict["level"] = logging.DEBUG |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 215 | |
| 216 | logging.basicConfig(**logger_dict) |
Ilya Menkov | 9533a89 | 2021-05-12 19:45:51 +0400 | [diff] [blame] | 217 | trace_len = args.trace_len |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 218 | |
| 219 | reporter = Reporter( |
| 220 | xunit_report=args.xunit_report, |
| 221 | output_xunit_report=args.output_xunit_report, |
| 222 | env_description=args.env_description, |
| 223 | test_results_link=args.test_results_link, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 224 | paste_url=args.paste_url, |
| 225 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 226 | suite = args.testrail_suite.format(args) |
| 227 | reporter.config_testrail( |
| 228 | base_url=args.testrail_url, |
| 229 | username=args.testrail_user, |
| 230 | password=args.testrail_password, |
| 231 | project=args.testrail_project, |
| 232 | tests_suite=suite, |
| 233 | send_skipped=args.send_skipped, |
| 234 | send_duplicates=args.send_duplicates, |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 235 | use_test_run_if_exists=args.use_test_run_if_exists, |
| 236 | ) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 237 | |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 238 | empty_classnames = reporter.get_empty_classnames() |
Roman Bubyr | f71f006 | 2024-03-26 14:16:35 +0100 | [diff] [blame] | 239 | all_empty_cases = reporter.get_testcases(empty_classnames) |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 240 | |
| 241 | reporter.update_testcases(all_empty_cases) |
| 242 | reporter.delete_duplicates() |
Ilya Menkov | 9533a89 | 2021-05-12 19:45:51 +0400 | [diff] [blame] | 243 | reporter.cut_long_traces(trace_len) |
rbubyr | fa820c8 | 2024-11-05 14:11:02 +0100 | [diff] [blame^] | 244 | reporter.remove_html_tags_in_traces() |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 245 | reporter.delete_temporary_file() |
| 246 | |
| 247 | |
stavrovska | 28772bc | 2024-05-22 09:33:50 +0200 | [diff] [blame] | 248 | if __name__ == "__main__": |
Ilya Menkov | bfc4c4e | 2019-10-17 17:08:17 +0400 | [diff] [blame] | 249 | try: |
| 250 | main() |
| 251 | except Exception: |
| 252 | traceback.print_exc(file=sys.stdout) |
| 253 | sys.exit(1) |