
Currently tests are sorted alphabetically by test class name regardless of the pass/fail status. When troubleshooting failed unit tests in jenkins jobs with many unit tests (> 11242 in nova), one must scroll potentially a lot or wait as the page loads to search for the word 'fail' to get to the details of the failed test. This sorts failed (and error) tests at the top of the HTML page for easier troubleshooting (sorted failed tests + sorted passed tests). Change-Id: I0b575e77c4a3e1cc73e60ea48ca5b9bf2e84d76f
77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import sys
|
|
|
|
from ddt import data
|
|
from ddt import ddt
|
|
from subunit import RemotedTestCase
|
|
from testtools import PlaceHolder
|
|
|
|
from os_testr import subunit2html
|
|
from os_testr.tests import base
|
|
|
|
|
|
@ddt
|
|
class TestSubunit2html(base.TestCase):
|
|
@data(RemotedTestCase, PlaceHolder)
|
|
def test_class_parsing(self, test_cls):
|
|
"""Tests that the class paths are parsed for v1 & v2 tests"""
|
|
test_ = test_cls("example.path.to.test.method")
|
|
obj_ = subunit2html.HtmlOutput()
|
|
cls_ = []
|
|
obj_._add_cls({}, cls_, test_, ())
|
|
self.assertEqual("example.path.to.test", cls_[0].name)
|
|
|
|
@data(RemotedTestCase, PlaceHolder)
|
|
def test_result_sorting(self, test_cls):
|
|
tests = []
|
|
for i in range(9):
|
|
tests.append(test_cls('example.path.to.test%d.method' % i))
|
|
# addFailure, addError, and addSkip need the real exc_info
|
|
try:
|
|
raise Exception('fake')
|
|
except Exception:
|
|
err = sys.exc_info()
|
|
obj = subunit2html.HtmlOutput()
|
|
obj.addSuccess(tests[3])
|
|
obj.addSuccess(tests[1])
|
|
# example.path.to.test2 has a failure
|
|
obj.addFailure(tests[2], err)
|
|
obj.addSkip(tests[0], err)
|
|
obj.addSuccess(tests[8])
|
|
# example.path.to.test5 has a failure (error)
|
|
obj.addError(tests[5], err)
|
|
# example.path.to.test4 has a failure
|
|
obj.addFailure(tests[4], err)
|
|
obj.addSuccess(tests[7])
|
|
# example.path.to.test6 has a failure
|
|
obj.addFailure(tests[6], err)
|
|
sorted_result = obj._sortResult(obj.result)
|
|
# _sortResult returns a list of results of format:
|
|
# [(class, [test_result_tuple, ...]), ...]
|
|
# sorted by str(class)
|
|
#
|
|
# Classes with failures (2, 4, 5, and 6) should be sorted separately
|
|
# at the top. The rest of the classes should be in sorted order after.
|
|
expected_class_order = ['example.path.to.test2',
|
|
'example.path.to.test4',
|
|
'example.path.to.test5',
|
|
'example.path.to.test6',
|
|
'example.path.to.test0',
|
|
'example.path.to.test1',
|
|
'example.path.to.test3',
|
|
'example.path.to.test7',
|
|
'example.path.to.test8']
|
|
for i, r in enumerate(sorted_result):
|
|
self.assertEqual(expected_class_order[i], str(r[0]))
|