blob: 15fc92279d59776f3abaac91cddbca66c7321c9d [file] [log] [blame]
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +04001#!/usr/bin/env python
2
3import argparse
4import logging
5import os
6import sys
7import traceback
8import warnings
9
10from reporter import Reporter
11
12warnings.simplefilter('always', DeprecationWarning)
13logger = logging.getLogger(__name__)
14
15if sys.version_info[0] == 3:
16 str_cls = str
17else:
18 str_cls = eval('unicode')
19
20
21def 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
31def parse_args(args):
32 defaults = {
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}',
Ilya Menkov9533a892021-05-12 19:45:51 +040043 'TRACE_LEN': 100,
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +040044 'ISO_ID': None,
45 'TESTRAIL_PLAN_NAME': None,
46 'ENV_DESCRIPTION': '',
47 'TEST_RESULTS_LINK': '',
48 'PASTE_BASE_URL': None
49 }
50 defaults = {k: os.environ.get(k, v) for k, v in defaults.items()}
51
52 parser = argparse.ArgumentParser(description='xUnit to testrail reporter')
53 parser.add_argument(
54 'xunit_report',
55 type=filename,
56 default=defaults['XUNIT_REPORT'],
57 help='xUnit report XML file')
58
59 parser.add_argument(
60 '--output-xunit-report',
61 type=str_cls,
62 default=defaults['OUTPUT_XUNIT_REPORT'],
63 help='Output xUnit report XML file after update')
64
65 parser.add_argument(
66 '--xunit-name-template',
67 type=str_cls,
68 default=defaults['XUNIT_NAME_TEMPLATE'],
69 help='template for xUnit cases to make id string')
70 parser.add_argument(
71 '--testrail-name-template',
72 type=str_cls,
73 default=defaults['TESTRAIL_NAME_TEMPLATE'],
74 help='template for TestRail cases to make id string')
75
76 parser.add_argument(
77 '--env-description',
78 type=str_cls,
79 default=defaults['ENV_DESCRIPTION'],
80 help='env deploy type description (for TestRun name)')
81
82 group = parser.add_mutually_exclusive_group()
83 group.add_argument(
84 '--iso-id',
85 type=str_cls,
86 default=defaults['ISO_ID'],
87 help='id of build Fuel iso (DEPRECATED)')
88 group.add_argument(
89 '--testrail-plan-name',
90 type=str_cls,
91 default=defaults['TESTRAIL_PLAN_NAME'],
92 help='name of test plan to be displayed in testrail')
93
94 parser.add_argument(
95 '--test-results-link',
96 type=str_cls,
97 default=defaults['TEST_RESULTS_LINK'],
98 help='link to test job results')
99 parser.add_argument(
100 '--testrail-url',
101 type=str_cls,
102 default=defaults['TESTRAIL_URL'],
103 help='base url of testrail')
104 parser.add_argument(
105 '--testrail-user',
106 type=str_cls,
107 default=defaults['TESTRAIL_USER'],
108 help='testrail user')
109 parser.add_argument(
110 '--testrail-password',
111 type=str_cls,
112 default=defaults['TESTRAIL_PASSWORD'],
113 help='testrail password')
114 parser.add_argument(
115 '--testrail-project',
116 type=str_cls,
117 default=defaults['TESTRAIL_PROJECT'],
118 help='testrail project name')
119 parser.add_argument(
120 '--testrail-milestone',
121 type=str_cls,
122 default=defaults['TESTRAIL_MILESTONE'],
123 help='testrail project milestone')
124 parser.add_argument(
125 '--testrail-suite',
126 type=str_cls,
127 default=defaults['TESTRAIL_TEST_SUITE'],
128 help='testrail project suite name')
129 parser.add_argument(
Ilya Menkov9533a892021-05-12 19:45:51 +0400130 '--trace-len',
131 type=int,
132 default=defaults['TRACE_LEN'],
133 help='testrail project name')
134 parser.add_argument(
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400135 '--send-skipped',
136 action='store_true',
137 default=False,
138 help='send skipped cases to testrail')
139 parser.add_argument(
140 '--send-duplicates',
141 action='store_true',
142 default=False,
143 help='send duplicated cases to testrail')
144 parser.add_argument(
145 '--paste-url',
146 type=str_cls,
147 default=defaults['PASTE_BASE_URL'],
148 help=('pastebin service JSON API URL to send test case logs and trace,'
149 ' example: http://localhost:5000/'))
150 parser.add_argument(
151 '--testrail-run-update',
152 dest='use_test_run_if_exists',
153 action='store_true',
154 default=False,
155 help='don\'t create new test run if such already exists')
156 parser.add_argument(
157 '--dry-run', '-n',
158 action='store_true',
159 default=False,
160 help='Just print mapping table')
161 parser.add_argument(
162 '--verbose',
163 '-v',
164 action='store_true',
165 default=False,
166 help='Verbose mode')
167
168 return parser.parse_args(args)
169
170
171def main(args=None):
172
173 args = args or sys.argv[1:]
174
175 args = parse_args(args)
176
177 if not args.testrail_plan_name:
178 args.testrail_plan_name = ('{0.testrail_milestone} iso '
179 '#{0.iso_id}').format(args)
180
181 msg = ("--iso-id parameter is DEPRECATED. "
182 "It is recommended to use --testrail-plan-name parameter.")
183 warnings.warn(msg, DeprecationWarning)
184
185 logger_dict = dict(stream=sys.stderr)
186 if args.verbose:
187 logger_dict['level'] = logging.DEBUG
188
189 logging.basicConfig(**logger_dict)
Ilya Menkov9533a892021-05-12 19:45:51 +0400190 trace_len = args.trace_len
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400191
192 reporter = Reporter(
193 xunit_report=args.xunit_report,
194 output_xunit_report=args.output_xunit_report,
195 env_description=args.env_description,
196 test_results_link=args.test_results_link,
197 paste_url=args.paste_url)
198 suite = args.testrail_suite.format(args)
199 reporter.config_testrail(
200 base_url=args.testrail_url,
201 username=args.testrail_user,
202 password=args.testrail_password,
203 project=args.testrail_project,
204 tests_suite=suite,
205 send_skipped=args.send_skipped,
206 send_duplicates=args.send_duplicates,
207 use_test_run_if_exists=args.use_test_run_if_exists)
208
209
210 all_cases = reporter.get_cases()
211 empty_classnames = reporter.get_empty_classnames()
212 all_empty_cases = reporter.get_testcases(all_cases, empty_classnames)
213
214 reporter.update_testcases(all_empty_cases)
215 reporter.delete_duplicates()
Ilya Menkov9533a892021-05-12 19:45:51 +0400216 reporter.cut_long_traces(trace_len)
Ilya Menkovbfc4c4e2019-10-17 17:08:17 +0400217 reporter.delete_temporary_file()
218
219
220if __name__ == '__main__':
221 try:
222 main()
223 except Exception:
224 traceback.print_exc(file=sys.stdout)
225 sys.exit(1)