Skip to content

Commit

Permalink
Merge pull request #64 from 2gis/feature/qttest-xunit-xml-parser
Browse files Browse the repository at this point in the history
Add Qt Test Xunit XML parser
  • Loading branch information
shreyderina committed Jul 4, 2017
2 parents f8824cb + edb8357 commit 9b3878d
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 3 deletions.
16 changes: 16 additions & 0 deletions cdws_api/testdata/qttestxunit-test-report.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="435" failures="2" tests="82" name="QmlUnitTests">
<properties>
<property value="5.9.0" name="QTestVersion"/>
<property value="5.9.0" name="QtVersion"/>
<property value="Qt 5.9.0" name="QtBuild"/>
</properties>
<testcase result="pass" name="passedTest"/>
<testcase name="skippedTest">
<!-- message="skip reason" type="skip" -->
</testcase>
<testcase result="fail" name="failedTest">
<!-- error log lines -->
<failure message="Error message" result="fail"/>
</testcase>
</testsuite>
34 changes: 34 additions & 0 deletions cdws_api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1564,6 +1564,40 @@ def test_upload_nunit_file(self):
self.assertEqual(1, passed['count'])
self.assertEqual(0.2, launch['duration'])

def test_upload_qttestxunit_file(self):
failed_failure_reason = \
'Error message\n\nLogs:\n error log lines \n \n '
skipped_failure_reason = \
'\n message="skip reason" type="skip" \n '

project = Project.objects.create(name='DummyTestProject')
testplan = TestPlan.objects.create(name='DummyTestPlan',
project=project)
self._post(file_name='qttestxunit-test-report.xml',
url='{}/qttestxunit/xunit.xml'.format(testplan.id))

launches = self._call_rest('get',
'launches/?testplan={}'.format(testplan.id))
self.assertEqual(1, launches['count'])
launch = launches['results'][0]
failed = self._call_rest(
'get',
'testresults/?launch={}&state={}'.format(launch['id'], FAILED))
skipped = self._call_rest(
'get',
'testresults/?launch={}&state={}'.format(launch['id'], SKIPPED))
passed = self._call_rest(
'get',
'testresults/?launch={}&state={}'.format(launch['id'], PASSED))
self.assertEqual(1, failed['count'])
self.assertEqual(failed_failure_reason,
failed["results"][0]["failure_reason"])
self.assertEqual(1, skipped['count'])
self.assertEqual(skipped_failure_reason,
skipped["results"][0]["failure_reason"])
self.assertEqual(1, passed['count'])
self.assertEqual(0, launch['duration'])

def test_upload_empty_file(self):
project = Project.objects.create(name='DummyTestProject')
testplan = TestPlan.objects.create(name='DummyTestPlan',
Expand Down
2 changes: 1 addition & 1 deletion cdws_api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -838,7 +838,7 @@ def post(self, request, filename, testplan_id=None, xunit_format=None):

launch_id = None
params = None
if xunit_format not in ['junit', 'nunit']:
if xunit_format not in ['junit', 'nunit', 'qttestxunit']:
return Response(data={'message': 'Unknown file format'},
status=status.HTTP_400_BAD_REQUEST)
if 'file' not in request.data:
Expand Down
34 changes: 32 additions & 2 deletions cdws_api/xml_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ def get_node(self, element, names):
def get_text(self, nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE \
or node.nodeType == node.CDATA_SECTION_NODE:
if node.nodeType in [node.TEXT_NODE, node.CDATA_SECTION_NODE,
node.COMMENT_NODE]:
rc.append(node.data)
return ''.join(rc)

Expand Down Expand Up @@ -108,6 +108,34 @@ def create_test_result(self, element, path):
result.save()


class QtTestXunitParser(JunitParser):
def create_test_result(self, element, path):
result = TestResult.objects.create(launch_id=self.launch_id)

result.duration = 0
result.name = element.getAttribute('name')[:127]
result.suite = path[:125]
result.state = BLOCKED
result.failure_reason = ''

test_result = element.getAttribute('result')
if test_result == 'pass':
result.state = PASSED
elif test_result == '':
result.state = SKIPPED
result.failure_reason = self.get_text(element.childNodes)
elif test_result == 'fail':
result.state = FAILED
failure = self.get_node(element, ['failure'])
logs = self.get_text(element.childNodes)
failure_reason = failure.getAttribute('message')
if logs:
failure_reason = '{}\n\nLogs:{}'.format(failure_reason, logs)
result.failure_reason = failure_reason

result.save()


class NunitParser(XmlParser):
def parse(self, element, path=''):
if element.nodeName == 'test-case':
Expand Down Expand Up @@ -193,6 +221,8 @@ def xml_parser_func(format, file_content, launch_id, params):
parser = NunitParser(launch.id)
elif format == 'junit':
parser = JunitParser(launch.id)
elif format == 'qttestxunit':
parser = QtTestXunitParser(launch.id)

parser.load_string(file_content)
parser.update_duration(launch)

0 comments on commit 9b3878d

Please sign in to comment.