Merge "Sort failed tests at the top on HTML result page"
This commit is contained in:
commit
b2d7365c89
@ -617,8 +617,12 @@ class HtmlOutput(testtools.TestResult):
|
|||||||
# unittest does not seems to run in any particular order.
|
# unittest does not seems to run in any particular order.
|
||||||
# Here at least we want to group them together by class.
|
# Here at least we want to group them together by class.
|
||||||
rmap = {}
|
rmap = {}
|
||||||
classes = []
|
# Differentiate between classes that have test failures so we can sort
|
||||||
|
# them at the top of the html page for easier troubleshooting
|
||||||
|
failclasses = []
|
||||||
|
passclasses = []
|
||||||
for n, t, o, e in result_list:
|
for n, t, o, e in result_list:
|
||||||
|
classes = failclasses if n == 1 or n == 2 else passclasses
|
||||||
if hasattr(t, '_tests'):
|
if hasattr(t, '_tests'):
|
||||||
for inner_test in t._tests:
|
for inner_test in t._tests:
|
||||||
self._add_cls(rmap, classes, inner_test,
|
self._add_cls(rmap, classes, inner_test,
|
||||||
@ -626,7 +630,9 @@ class HtmlOutput(testtools.TestResult):
|
|||||||
else:
|
else:
|
||||||
self._add_cls(rmap, classes, t, (n, t, o, e))
|
self._add_cls(rmap, classes, t, (n, t, o, e))
|
||||||
classort = lambda s: str(s)
|
classort = lambda s: str(s)
|
||||||
sortedclasses = sorted(classes, key=classort)
|
sortedfailclasses = sorted(failclasses, key=classort)
|
||||||
|
sortedpassclasses = sorted(passclasses, key=classort)
|
||||||
|
sortedclasses = sortedfailclasses + sortedpassclasses
|
||||||
r = [(cls, rmap[str(cls)]) for cls in sortedclasses]
|
r = [(cls, rmap[str(cls)]) for cls in sortedclasses]
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
from ddt import data
|
from ddt import data
|
||||||
from ddt import ddt
|
from ddt import ddt
|
||||||
from subunit import RemotedTestCase
|
from subunit import RemotedTestCase
|
||||||
@ -29,3 +31,46 @@ class TestSubunit2html(base.TestCase):
|
|||||||
cls_ = []
|
cls_ = []
|
||||||
obj_._add_cls({}, cls_, test_, ())
|
obj_._add_cls({}, cls_, test_, ())
|
||||||
self.assertEqual("example.path.to.test", cls_[0].name)
|
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]))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user