deb-os-testr/os_testr/tests/test_subunit2html.py
melanie witt f95f1d4448 Sort failed tests at the top on HTML result page
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
2016-05-26 20:38:37 +00:00

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]))