204fe38386
Change-Id: Iea91567941e16007750498114d279dde12571fb8
93 lines
3.6 KiB
Python
93 lines
3.6 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 success, a failure, and a success
|
|
obj.addSuccess(tests[6])
|
|
obj.addFailure(tests[6], err)
|
|
obj.addSuccess(tests[6])
|
|
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]))
|
|
|
|
@data(RemotedTestCase, PlaceHolder)
|
|
def test_generate_report_with_no_ascii_characters(self, test_cls):
|
|
# The test examines a case where an error containing no ascii
|
|
# characters is received.
|
|
test = test_cls('example.path.to.test1.method')
|
|
try:
|
|
raise Exception('\xe2\x82\xa5')
|
|
except Exception:
|
|
err = sys.exc_info()
|
|
obj = subunit2html.HtmlOutput()
|
|
# Add failure that contains no ascii characters
|
|
obj.addFailure(test, err)
|
|
obj._generate_report()
|