Refactor the code of osccore-qa-testing-tools to comply with PEP8.
Related-prod: PRODX-42195
Change-Id: Id05e7584e0d024127ce1bd5042cfe681a1b52e2d
diff --git a/update_testrail_xml/client.py b/update_testrail_xml/client.py
index 94bc5f6..a1b45a9 100644
--- a/update_testrail_xml/client.py
+++ b/update_testrail_xml/client.py
@@ -1,4 +1,5 @@
from __future__ import absolute_import
+
import logging
import time
@@ -6,7 +7,7 @@
logger = logging.getLogger(__name__)
-requests_logger = logging.getLogger('requests.packages.urllib3')
+requests_logger = logging.getLogger("requests.packages.urllib3")
requests_logger.setLevel(logging.WARNING)
@@ -17,8 +18,10 @@
def find_all(self, **kwargs):
filtered = ItemSet(
- x for x in self
- if all(getattr(x, k) == v for k, v in kwargs.items()))
+ x
+ for x in self
+ if all(getattr(x, k) == v for k, v in kwargs.items())
+ )
filtered._item_class = self._item_class
return filtered
@@ -32,8 +35,8 @@
class Collection(object):
- _list_url = 'get_{name}s'
- _add_url = 'add_{name}'
+ _list_url = "get_{name}s"
+ _add_url = "add_{name}"
def __init__(self, item_class=None, parent_id=None, **kwargs):
self._item_class = item_class
@@ -46,12 +49,12 @@
name = self._item_class._api_name()
if id is None:
items = self._list(name)
- if 'error' in items:
+ if "error" in items:
raise Exception(items)
- if name == 'project':
- items = items['projects']
- if name == 'case':
- items = items['cases']
+ if name == "project":
+ items = items["projects"]
+ if name == "case":
+ items = items["cases"]
items = ItemSet(self._to_object(x) for x in items)
items._item_class = self._item_class
return items
@@ -60,7 +63,7 @@
return self._item_class.get(id)
def __repr__(self):
- return '<Collection of {}>'.format(self._item_class.__name__)
+ return "<Collection of {}>".format(self._item_class.__name__)
def _to_object(self, data):
return self._item_class(**data)
@@ -69,8 +72,8 @@
params = params or {}
url = self._list_url.format(name=name)
if self.parent_id is not None:
- url += '/{}'.format(self.parent_id)
- return self._handler('GET', url, params=params)
+ url += "/{}".format(self.parent_id)
+ return self._handler("GET", url, params=params)
def find_all(self, **kwargs):
return self().find_all(**kwargs)
@@ -92,10 +95,10 @@
class Item(object):
- _get_url = 'get_{name}/{id}'
- _update_url = 'update_{name}/{id}'
+ _get_url = "get_{name}/{id}"
+ _update_url = "update_{name}/{id}"
_handler = None
- _repr_field = 'name'
+ _repr_field = "name"
def __init__(self, id=None, **kwargs):
self.id = id
@@ -112,29 +115,30 @@
raise AttributeError
def __setattr__(self, name, value):
- if '_data' in self.__dict__ and name not in self.__dict__:
- self.__dict__['_data'][name] = value
+ if "_data" in self.__dict__ and name not in self.__dict__:
+ self.__dict__["_data"][name] = value
else:
self.__dict__[name] = value
def __repr__(self):
- name = getattr(self, self._repr_field, '')
+ name = getattr(self, self._repr_field, "")
name = repr(name)
- return '<{c.__name__}({s.id}) {name} at 0x{id:x}>'.format(
- s=self, c=self.__class__, id=id(self), name=name)
+ return "<{c.__name__}({s.id}) {name} at 0x{id:x}>".format(
+ s=self, c=self.__class__, id=id(self), name=name
+ )
@classmethod
def get(cls, id):
name = cls._api_name()
url = cls._get_url.format(name=name, id=id)
- result = cls._handler('GET', url)
- if 'error' in result:
+ result = cls._handler("GET", url)
+ if "error" in result:
raise Exception(result)
return cls(**result)
def update(self):
url = self._update_url.format(name=self._api_name(), id=self.id)
- self._handler('POST', url, json=self.data)
+ self._handler("POST", url, json=self.data)
@property
def data(self):
@@ -152,8 +156,10 @@
def cases(self):
return CaseCollection(
Case,
- _list_url='get_cases/{}&suite_id={}'.format(self.project_id,
- self.id))
+ _list_url="get_cases/{}&suite_id={}".format(
+ self.project_id, self.id
+ ),
+ )
class CaseCollection(Collection):
@@ -165,18 +171,20 @@
class Plan(Item):
- def __init__(self,
- name,
- description=None,
- milestone_id=None,
- entries=None,
- id=None,
- **kwargs):
+ def __init__(
+ self,
+ name,
+ description=None,
+ milestone_id=None,
+ entries=None,
+ id=None,
+ **kwargs
+ ):
add_kwargs = {
- 'name': name,
- 'description': description,
- 'milestone_id': milestone_id,
- 'entries': entries or [],
+ "name": name,
+ "description": description,
+ "milestone_id": milestone_id,
+ "entries": entries or [],
}
kwargs.update(add_kwargs)
return super(self.__class__, self).__init__(id, **kwargs)
@@ -186,14 +194,14 @@
def __init__(self, base_url, username, password):
self.username = username
self.password = password
- self.base_url = base_url.rstrip('/') + '/index.php?/api/v2/'
+ self.base_url = base_url.rstrip("/") + "/index.php?/api/v2/"
Item._handler = self._query
def _query(self, method, url, **kwargs):
url = self.base_url + url
- headers = {'Content-type': 'application/json'}
- logger.debug('Make {} request to {}'.format(method, url))
+ headers = {"Content-type": "application/json"}
+ logger.debug("Make {} request to {}".format(method, url))
for _ in range(5):
response = requests.request(
method,
@@ -201,7 +209,8 @@
allow_redirects=False,
auth=(self.username, self.password),
headers=headers,
- **kwargs)
+ **kwargs
+ )
# To many requests
if response.status_code == 429:
time.sleep(60)
@@ -210,13 +219,15 @@
break
# Redirect or error
if response.status_code >= 300:
- raise requests.HTTPError("Wrong response:\n"
- "status_code: {0.status_code}\n"
- "headers: {0.headers}\n"
- "content: '{0.content}'".format(response),
- response=response)
+ raise requests.HTTPError(
+ "Wrong response:\n"
+ "status_code: {0.status_code}\n"
+ "headers: {0.headers}\n"
+ "content: '{0.content}'".format(response),
+ response=response,
+ )
result = response.json()
- if 'error' in result:
+ if "error" in result:
logger.warning(result)
return result
@@ -231,8 +242,9 @@
self.conditions = conditions
def __str__(self):
- conditions = ', '.join(['{}="{}"'.format(x, y)
- for (x, y) in self.conditions.items()])
- return u'{type} with {conditions}'.format(
- type=self.item_class._api_name().title(),
- conditions=conditions)
\ No newline at end of file
+ conditions = ", ".join(
+ ['{}="{}"'.format(x, y) for (x, y) in self.conditions.items()]
+ )
+ return "{type} with {conditions}".format(
+ type=self.item_class._api_name().title(), conditions=conditions
+ )
diff --git a/update_testrail_xml/cmd.py b/update_testrail_xml/cmd.py
index bec9097..ea7a5f3 100644
--- a/update_testrail_xml/cmd.py
+++ b/update_testrail_xml/cmd.py
@@ -9,13 +9,13 @@
from reporter import Reporter
-warnings.simplefilter('always', DeprecationWarning)
+warnings.simplefilter("always", DeprecationWarning)
logger = logging.getLogger(__name__)
if sys.version_info[0] == 3:
str_cls = str
else:
- str_cls = eval('unicode')
+ str_cls = eval("unicode")
def filename(string):
@@ -30,140 +30,164 @@
def parse_args(args):
defaults = {
- 'TESTRAIL_URL': 'https://mirantis.testrail.com',
- 'TESTRAIL_USER': 'user@example.com',
- 'TESTRAIL_PASSWORD': 'password',
- 'TESTRAIL_PROJECT': 'Mirantis OpenStack',
- 'TESTRAIL_MILESTONE': '9.0',
- 'TESTRAIL_TEST_SUITE': '[{0.testrail_milestone}] MOSQA',
- 'XUNIT_REPORT': 'report.xml',
- 'OUTPUT_XUNIT_REPORT': 'output_report.xml',
- 'XUNIT_NAME_TEMPLATE': '{id}',
- 'TESTRAIL_NAME_TEMPLATE': '{custom_report_label}',
- 'TRACE_LEN': 100,
- 'ISO_ID': None,
- 'TESTRAIL_PLAN_NAME': None,
- 'ENV_DESCRIPTION': '',
- 'TEST_RESULTS_LINK': '',
- 'PASTE_BASE_URL': None
+ "TESTRAIL_URL": "https://mirantis.testrail.com",
+ "TESTRAIL_USER": "user@example.com",
+ "TESTRAIL_PASSWORD": "password",
+ "TESTRAIL_PROJECT": "Mirantis OpenStack",
+ "TESTRAIL_MILESTONE": "9.0",
+ "TESTRAIL_TEST_SUITE": "[{0.testrail_milestone}] MOSQA",
+ "XUNIT_REPORT": "report.xml",
+ "OUTPUT_XUNIT_REPORT": "output_report.xml",
+ "XUNIT_NAME_TEMPLATE": "{id}",
+ "TESTRAIL_NAME_TEMPLATE": "{custom_report_label}",
+ "TRACE_LEN": 100,
+ "ISO_ID": None,
+ "TESTRAIL_PLAN_NAME": None,
+ "ENV_DESCRIPTION": "",
+ "TEST_RESULTS_LINK": "",
+ "PASTE_BASE_URL": None,
}
defaults = {k: os.environ.get(k, v) for k, v in defaults.items()}
- parser = argparse.ArgumentParser(description='xUnit to testrail reporter')
+ parser = argparse.ArgumentParser(description="xUnit to testrail reporter")
parser.add_argument(
- 'xunit_report',
+ "xunit_report",
type=filename,
- default=defaults['XUNIT_REPORT'],
- help='xUnit report XML file')
+ default=defaults["XUNIT_REPORT"],
+ help="xUnit report XML file",
+ )
parser.add_argument(
- '--output-xunit-report',
+ "--output-xunit-report",
type=str_cls,
- default=defaults['OUTPUT_XUNIT_REPORT'],
- help='Output xUnit report XML file after update')
+ default=defaults["OUTPUT_XUNIT_REPORT"],
+ help="Output xUnit report XML file after update",
+ )
parser.add_argument(
- '--xunit-name-template',
+ "--xunit-name-template",
type=str_cls,
- default=defaults['XUNIT_NAME_TEMPLATE'],
- help='template for xUnit cases to make id string')
+ default=defaults["XUNIT_NAME_TEMPLATE"],
+ help="template for xUnit cases to make id string",
+ )
parser.add_argument(
- '--testrail-name-template',
+ "--testrail-name-template",
type=str_cls,
- default=defaults['TESTRAIL_NAME_TEMPLATE'],
- help='template for TestRail cases to make id string')
+ default=defaults["TESTRAIL_NAME_TEMPLATE"],
+ help="template for TestRail cases to make id string",
+ )
parser.add_argument(
- '--env-description',
+ "--env-description",
type=str_cls,
- default=defaults['ENV_DESCRIPTION'],
- help='env deploy type description (for TestRun name)')
+ default=defaults["ENV_DESCRIPTION"],
+ help="env deploy type description (for TestRun name)",
+ )
group = parser.add_mutually_exclusive_group()
group.add_argument(
- '--iso-id',
+ "--iso-id",
type=str_cls,
- default=defaults['ISO_ID'],
- help='id of build Fuel iso (DEPRECATED)')
+ default=defaults["ISO_ID"],
+ help="id of build Fuel iso (DEPRECATED)",
+ )
group.add_argument(
- '--testrail-plan-name',
+ "--testrail-plan-name",
type=str_cls,
- default=defaults['TESTRAIL_PLAN_NAME'],
- help='name of test plan to be displayed in testrail')
+ default=defaults["TESTRAIL_PLAN_NAME"],
+ help="name of test plan to be displayed in testrail",
+ )
parser.add_argument(
- '--test-results-link',
+ "--test-results-link",
type=str_cls,
- default=defaults['TEST_RESULTS_LINK'],
- help='link to test job results')
+ default=defaults["TEST_RESULTS_LINK"],
+ help="link to test job results",
+ )
parser.add_argument(
- '--testrail-url',
+ "--testrail-url",
type=str_cls,
- default=defaults['TESTRAIL_URL'],
- help='base url of testrail')
+ default=defaults["TESTRAIL_URL"],
+ help="base url of testrail",
+ )
parser.add_argument(
- '--testrail-user',
+ "--testrail-user",
type=str_cls,
- default=defaults['TESTRAIL_USER'],
- help='testrail user')
+ default=defaults["TESTRAIL_USER"],
+ help="testrail user",
+ )
parser.add_argument(
- '--testrail-password',
+ "--testrail-password",
type=str_cls,
- default=defaults['TESTRAIL_PASSWORD'],
- help='testrail password')
+ default=defaults["TESTRAIL_PASSWORD"],
+ help="testrail password",
+ )
parser.add_argument(
- '--testrail-project',
+ "--testrail-project",
type=str_cls,
- default=defaults['TESTRAIL_PROJECT'],
- help='testrail project name')
+ default=defaults["TESTRAIL_PROJECT"],
+ help="testrail project name",
+ )
parser.add_argument(
- '--testrail-milestone',
+ "--testrail-milestone",
type=str_cls,
- default=defaults['TESTRAIL_MILESTONE'],
- help='testrail project milestone')
+ default=defaults["TESTRAIL_MILESTONE"],
+ help="testrail project milestone",
+ )
parser.add_argument(
- '--testrail-suite',
+ "--testrail-suite",
type=str_cls,
- default=defaults['TESTRAIL_TEST_SUITE'],
- help='testrail project suite name')
+ default=defaults["TESTRAIL_TEST_SUITE"],
+ help="testrail project suite name",
+ )
parser.add_argument(
- '--trace-len',
+ "--trace-len",
type=int,
- default=defaults['TRACE_LEN'],
- help='testrail project name')
+ default=defaults["TRACE_LEN"],
+ help="testrail project name",
+ )
parser.add_argument(
- '--send-skipped',
- action='store_true',
+ "--send-skipped",
+ action="store_true",
default=False,
- help='send skipped cases to testrail')
+ help="send skipped cases to testrail",
+ )
parser.add_argument(
- '--send-duplicates',
- action='store_true',
+ "--send-duplicates",
+ action="store_true",
default=False,
- help='send duplicated cases to testrail')
+ help="send duplicated cases to testrail",
+ )
parser.add_argument(
- '--paste-url',
+ "--paste-url",
type=str_cls,
- default=defaults['PASTE_BASE_URL'],
- help=('pastebin service JSON API URL to send test case logs and trace,'
- ' example: http://localhost:5000/'))
+ default=defaults["PASTE_BASE_URL"],
+ help=(
+ "pastebin service JSON API URL to send test case logs and trace,"
+ " example: http://localhost:5000/"
+ ),
+ )
parser.add_argument(
- '--testrail-run-update',
- dest='use_test_run_if_exists',
- action='store_true',
+ "--testrail-run-update",
+ dest="use_test_run_if_exists",
+ action="store_true",
default=False,
- help='don\'t create new test run if such already exists')
+ help="don't create new test run if such already exists",
+ )
parser.add_argument(
- '--dry-run', '-n',
- action='store_true',
+ "--dry-run",
+ "-n",
+ action="store_true",
default=False,
- help='Just print mapping table')
+ help="Just print mapping table",
+ )
parser.add_argument(
- '--verbose',
- '-v',
- action='store_true',
+ "--verbose",
+ "-v",
+ action="store_true",
default=False,
- help='Verbose mode')
+ help="Verbose mode",
+ )
return parser.parse_args(args)
@@ -175,16 +199,19 @@
args = parse_args(args)
if not args.testrail_plan_name:
- args.testrail_plan_name = ('{0.testrail_milestone} iso '
- '#{0.iso_id}').format(args)
+ args.testrail_plan_name = (
+ "{0.testrail_milestone} iso " "#{0.iso_id}"
+ ).format(args)
- msg = ("--iso-id parameter is DEPRECATED. "
- "It is recommended to use --testrail-plan-name parameter.")
+ msg = (
+ "--iso-id parameter is DEPRECATED. "
+ "It is recommended to use --testrail-plan-name parameter."
+ )
warnings.warn(msg, DeprecationWarning)
logger_dict = dict(stream=sys.stderr)
if args.verbose:
- logger_dict['level'] = logging.DEBUG
+ logger_dict["level"] = logging.DEBUG
logging.basicConfig(**logger_dict)
trace_len = args.trace_len
@@ -194,7 +221,8 @@
output_xunit_report=args.output_xunit_report,
env_description=args.env_description,
test_results_link=args.test_results_link,
- paste_url=args.paste_url)
+ paste_url=args.paste_url,
+ )
suite = args.testrail_suite.format(args)
reporter.config_testrail(
base_url=args.testrail_url,
@@ -204,7 +232,8 @@
tests_suite=suite,
send_skipped=args.send_skipped,
send_duplicates=args.send_duplicates,
- use_test_run_if_exists=args.use_test_run_if_exists)
+ use_test_run_if_exists=args.use_test_run_if_exists,
+ )
empty_classnames = reporter.get_empty_classnames()
all_empty_cases = reporter.get_testcases(empty_classnames)
@@ -215,7 +244,7 @@
reporter.delete_temporary_file()
-if __name__ == '__main__':
+if __name__ == "__main__":
try:
main()
except Exception:
diff --git a/update_testrail_xml/reporter.py b/update_testrail_xml/reporter.py
index 4c04e09..438759c 100644
--- a/update_testrail_xml/reporter.py
+++ b/update_testrail_xml/reporter.py
@@ -1,15 +1,14 @@
from __future__ import absolute_import, print_function
-from functools import wraps
+import logging
import os
import re
-import six
-
import xml.etree.ElementTree as ET
+from functools import wraps
+import six
from client import Client as TrClient
-import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@@ -27,12 +26,16 @@
class Reporter(object):
- def __init__(self,
- xunit_report,
- output_xunit_report,
- env_description,
- test_results_link,
- paste_url, *args, **kwargs):
+ def __init__(
+ self,
+ xunit_report,
+ output_xunit_report,
+ env_description,
+ test_results_link,
+ paste_url,
+ *args,
+ **kwargs
+ ):
self._config = {}
self._cache = {}
self.xunit_report = xunit_report
@@ -43,17 +46,22 @@
super(Reporter, self).__init__(*args, **kwargs)
- def config_testrail(self,
- base_url,
- username,
- password,
- project,
- tests_suite,
- send_skipped=False,
- use_test_run_if_exists=False, send_duplicates=False):
- self._config['testrail'] = dict(base_url=base_url,
- username=username,
- password=password, )
+ def config_testrail(
+ self,
+ base_url,
+ username,
+ password,
+ project,
+ tests_suite,
+ send_skipped=False,
+ use_test_run_if_exists=False,
+ send_duplicates=False,
+ ):
+ self._config["testrail"] = dict(
+ base_url=base_url,
+ username=username,
+ password=password,
+ )
self.project_name = project
self.tests_suite_name = tests_suite
self.send_skipped = send_skipped
@@ -62,7 +70,7 @@
@property
def testrail_client(self):
- return TrClient(**self._config['testrail'])
+ return TrClient(**self._config["testrail"])
@property
@memoize
@@ -79,55 +87,62 @@
def cases(self):
return self.suite.cases()
-# ================================================================
+ # ================================================================
- temporary_filename = 'temporary_xunit_report.xml'
- logger.info(' Temporrary filename is: {}'.format(temporary_filename))
+ temporary_filename = "temporary_xunit_report.xml"
+ logger.info(" Temporrary filename is: {}".format(temporary_filename))
def describe_testrail_case(self, case):
return {
k: v
- for k, v in case.data.items() if isinstance(v, six.string_types)
+ for k, v in case.data.items()
+ if isinstance(v, six.string_types)
}
def get_cases(self):
"""Get all the testcases from the server"""
- logger.info(' Start gerring cases from the Testrail')
+ logger.info(" Start gerring cases from the Testrail")
cases_data = []
cases = self.suite.cases()
for case in cases:
case_data = self.describe_testrail_case(case)
cases_data.append(case_data)
- logger.info(' Cases were got from the Testrail')
+ logger.info(" Cases were got from the Testrail")
return cases_data
def get_empty_classnames(self):
tree = ET.parse(self.xunit_report)
root = tree.getroot()
- if root[0].tag == 'testsuite':
+ if root[0].tag == "testsuite":
root = root[0]
classnames = []
for child in root:
- if child.attrib['classname'] == '' and child[0].tag == 'failure':
- m = re.search(r'\(.*\)', child.attrib['name'])
+ if child.attrib["classname"] == "" and child[0].tag == "failure":
+ m = re.search(r"\(.*\)", child.attrib["name"])
classname = m.group()[1:-1]
- classnames.append({'classname': classname,
- 'data': child[0].text,
- 'fullname': child.attrib.get('name')})
+ classnames.append(
+ {
+ "classname": classname,
+ "data": child[0].text,
+ "fullname": child.attrib.get("name"),
+ }
+ )
- logger.info(' Got empty classnames from xml file')
+ logger.info(" Got empty classnames from xml file")
return classnames
def get_testcases(self, empty_classnames):
needed_cases = []
for empty_classname in empty_classnames:
- updated_case = {'classname': empty_classname['classname'],
- 'name': '.' + empty_classname['fullname'],
- 'data': empty_classname['data']}
+ updated_case = {
+ "classname": empty_classname["classname"],
+ "name": "." + empty_classname["fullname"],
+ "data": empty_classname["data"],
+ }
needed_cases.append(updated_case)
- logger.info(' Got test cases for updating xml file')
+ logger.info(" Got test cases for updating xml file")
return needed_cases
def update_testcases(self, cases):
@@ -136,73 +151,107 @@
for case in cases:
testcase = ET.Element("testcase")
- testcase.attrib['classname'] = "{}".format(case['classname'])
- testcase.attrib['name'] = "{}".format(case['name'])
- testcase.attrib['time'] = "0.000"
+ testcase.attrib["classname"] = "{}".format(case["classname"])
+ testcase.attrib["name"] = "{}".format(case["name"])
+ testcase.attrib["time"] = "0.000"
- skip = ET.SubElement(testcase, 'failure')
- skip.text = case['data']
+ skip = ET.SubElement(testcase, "failure")
+ skip.text = case["data"]
root.append(testcase)
for _ in cases:
for child in root:
try:
- if child.attrib['classname'] == "":
+ if child.attrib["classname"] == "":
root.remove(child)
except KeyError:
pass
- logger.info(' Create temporrary file: {}'.format(str(self.temporary_filename)))
+ logger.info(
+ " Create temporrary file: {}".format(str(self.temporary_filename))
+ )
tree = ET.ElementTree(root)
tree.write(self.temporary_filename)
- logger.info(' Temporrary file was created: {}'.format(self.check_file_exists(self.temporary_filename)))
+ logger.info(
+ " Temporrary file was created: {}".format(
+ self.check_file_exists(self.temporary_filename)
+ )
+ )
+
+ @staticmethod
+ def get_duplicates(all_cases):
+ return sorted(
+ list(set([x for x in all_cases if all_cases.count(x) > 1]))
+ )
def delete_duplicates(self):
- logger.info(' Start deleting duplicates from xml file: {}'.format(self.temporary_filename))
+ logger.info(
+ " Start deleting duplicates from xml file: {}".format(
+ self.temporary_filename
+ )
+ )
tree = ET.parse(self.temporary_filename)
root = tree.getroot()
- if root[0].tag == 'testsuite':
+ if root[0].tag == "testsuite":
root = root[0]
all_cases = []
for child in root:
try:
- all_cases.append((child.attrib['classname'], child.attrib['name']))
+ all_cases.append(
+ (child.attrib["classname"], child.attrib["name"])
+ )
except KeyError:
pass
# Get duplicates
- for_stack = lambda all_cases: sorted(list(set([x for x in all_cases if all_cases.count(x) > 1])))
- duplicate_cases = for_stack(all_cases)
+ duplicate_cases = self.get_duplicates(all_cases)
# Remove duplicates from xml
for case in duplicate_cases:
for child in root:
try:
- if child.attrib['classname'] == case[0] and child.attrib['name'] == case[1]:
- if (child.attrib['time'] == '0.000' or
- hasattr(next(iter(child), None), 'tag') and child[0].tag == 'error'):
+ if (
+ child.attrib["classname"] == case[0]
+ and child.attrib["name"] == case[1]
+ ):
+ if (
+ child.attrib["time"] == "0.000"
+ or hasattr(next(iter(child), None), "tag")
+ and child[0].tag == "error"
+ ):
child.clear()
except KeyError:
pass
- logger.info(' Start saving results to the file: {}'.format(self.output_xunit_report))
+ logger.info(
+ " Start saving results to the file: {}".format(
+ self.output_xunit_report
+ )
+ )
tree = ET.ElementTree(root)
tree.write(self.temporary_filename)
- logger.info(' {} file was created: {}'.format(self.output_xunit_report, self.check_file_exists(self.output_xunit_report)))
+ logger.info(
+ " {} file was created: {}".format(
+ self.output_xunit_report,
+ self.check_file_exists(self.output_xunit_report),
+ )
+ )
def cut_long_traces(self, trace_len):
tree = ET.parse(self.temporary_filename)
root = tree.getroot()
- if root[0].tag == 'testsuite':
+ if root[0].tag == "testsuite":
root = root[0]
for child in root:
try:
- if child[0].text.count('\n') > trace_len:
- ind = [m.start() for m in re.finditer('\n', child[0].text)][-trace_len]
+ if child[0].text.count("\n") > trace_len:
+ ind = [
+ m.start() for m in re.finditer("\n", child[0].text)
+ ][-trace_len]
old = child[0].text[ind:]
child[0].text = old
except IndexError:
@@ -215,4 +264,8 @@
def delete_temporary_file(self):
os.remove(self.temporary_filename)
- logger.info(' Temporrary file exists: {}'.format(self.check_file_exists(self.temporary_filename)))
+ logger.info(
+ " Temporrary file exists: {}".format(
+ self.check_file_exists(self.temporary_filename)
+ )
+ )