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