diff --git a/CHANGELOG.md b/CHANGELOG.md index fae56cb..058ac04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,20 @@ This project adheres to [Semantic Versioning](http://semver.org/) and http://kee ### Added - CHANGELOG.md from @dash0002 +## [1.0.0] ### Changed - Moved license content from python file to LICENSE - Updated README to reflect current state of project - Upgraded to support Python 3.4.3 -### Changed v1.0.1 +## [1.0.1] +### Changed - Imported select functions only rather than the entire module. - remove unused variables. - Remove string slice and use a datetime function instead. - Now compatible with python 3.5.2 - Added Contributor Dark-Passenger to Readme + +## [1.0.2] +### Added +- Added support for skip tests. diff --git a/HTMLTestRunner.py b/HTMLTestRunner.py index b0b0a8d..59f6680 100644 --- a/HTMLTestRunner.py +++ b/HTMLTestRunner.py @@ -1,4 +1,4 @@ -__version__ = "1.0.1" +__version__ = "1.0.2" from datetime import datetime from io import StringIO @@ -92,6 +92,7 @@ class Template_mixin(object): 0: 'pass', 1: 'fail', 2: 'error', + 3: 'skip', } DEFAULT_TITLE = 'Unit Test Report' @@ -293,8 +294,10 @@ class Template_mixin(object): .passClass { background-color: #6c6; } .failClass { background-color: #c60; } .errorClass { background-color: #c00; } +.skipClass { background-color: #ff0; } .passCase { color: #6c6; } .failCase { color: #c60; font-weight: bold; } +.skipCase { color: #ff0; font-weight: bold; } .errorCase { color: #c00; font-weight: bold; } .hiddenRow { display: none; } .testcase { margin-left: 2em; } @@ -349,6 +352,7 @@ class Template_mixin(object): Test Group/Test case Count Pass + Skip Fail Error View @@ -358,6 +362,7 @@ class Template_mixin(object): Total %(count)s %(Pass)s + %(skip)s %(fail)s %(error)s   @@ -370,6 +375,7 @@ class Template_mixin(object): %(desc)s %(count)s %(Pass)s + %(skip)s %(fail)s %(error)s Detail @@ -435,6 +441,7 @@ def __init__(self, verbosity=1): self.stdout0 = None self.stderr0 = None self.success_count = 0 + self.skip_count = 0 self.failure_count = 0 self.error_count = 0 self.verbosity = verbosity @@ -518,6 +525,19 @@ def addFailure(self, test, err): else: sys.stderr.write('F') + def addSkip(self, test, err): + self.skip_count += 1 + TestResult.addSkip(self, test, err) + _exc_str = self.skipped[-1][1] + output = self.complete_output() + self.result.append((3, test, output, _exc_str)) + if self.verbosity > 1: + sys.stderr.write('S ') + sys.stderr.write(str(test)) + sys.stderr.write('\n') + else: + sys.stderr.write('S') + class HTMLTestRunner(Template_mixin): """ @@ -571,6 +591,7 @@ def getReportAttributes(self, result): duration = str(self.stopTime - self.startTime) status = [] if result.success_count: status.append('Pass %s' % result.success_count) + if result.skip_count: status.append('Skip %s' % result.skip_count ) if result.failure_count: status.append('Failure %s' % result.failure_count) if result.error_count: status.append('Error %s' % result.error_count ) if status: @@ -627,11 +648,12 @@ def _generate_report(self, result): sortedResult = self.sortResult(result.result) for cid, (cls, cls_results) in enumerate(sortedResult): # subtotal for a class - np = nf = ne = 0 + np = ns = nf = ne = 0 for n,t,o,e in cls_results: if n == 0: np += 1 elif n == 1: nf += 1 - else: ne += 1 + elif n == 2: ne += 1 + elif n == 3: ns += 1 # format class description if cls.__module__ == "__main__": @@ -642,9 +664,9 @@ def _generate_report(self, result): desc = doc and '%s: %s' % (name, doc) or name row = self.REPORT_CLASS_TMPL % dict( - style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or 'passClass', + style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or ns > 0 and 'skipClass' or 'passClass', desc = desc, - count = np+nf+ne, + count = np+ns+nf+ne, Pass = np, fail = nf, error = ne, @@ -657,8 +679,9 @@ def _generate_report(self, result): report = self.REPORT_TMPL % dict( test_list = ''.join(rows), - count = str(result.success_count+result.failure_count+result.error_count), + count = str(result.success_count+result.failure_count+result.error_count+result.skip_count), Pass = str(result.success_count), + skip = str(result.skip_count), fail = str(result.failure_count), error = str(result.error_count), ) diff --git a/README.md b/README.md index 12802a8..173ceaf 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ by dash0002. In it's current iteration and maintenance, our goals are still the to be able to quickly generate an HTML test report. ## Installation -Supporting Python 3.4.3 +Supporting Python 3 - 3.5 ### PIP (recommended) @@ -57,9 +57,10 @@ as-is. ## Contributors -Way Yip Tung - https://github.com/tungwaiyip -Asish Dash - https://github.com/dash0002 -Dhruv Paranjape - https://github.com/dark-passenger +- Way Yip Tung - https://github.com/tungwaiyip +- Asish Dash - https://github.com/dash0002 +- Dhruv Paranjape - https://github.com/dark-passenger +- Ethan Estrada - https://github.com/eestrada Contributions are gladly accepted as this is a side project at best. Please, also consider this when looking at feedback cycles, issues, pull requests, etc. diff --git a/test_HTMLTestRunner.py b/test_HTMLTestRunner.py index 61eaa48..0cc77cc 100644 --- a/test_HTMLTestRunner.py +++ b/test_HTMLTestRunner.py @@ -1,34 +1,37 @@ # -*- coding: utf-8 -*- -import io as StringIO -import sys -import unittest -import HTMLTestRunner +from io import StringIO +from unittest import TestSuite, TestLoader, skip, TextTestRunner, TestCase +from HTMLTestRunner import HTMLTestRunner import tests from tests.SampleTestPass import SampleTestPass from tests.SampleTestFail import SampleTestFail from tests.SampleTestBasic import SampleTestBasic -class TestHTMLTestRunner(unittest.TestCase): +class TestHTMLTestRunner(TestCase): def setUp(self): - self.suite = unittest.TestSuite() - self.loader = unittest.TestLoader() + self.suite = TestSuite() + self.loader = TestLoader() self.suite.addTests(self.loader.loadTestsFromModule(tests.SampleTestPass)) self.suite.addTests(self.loader.loadTestsFromModule(tests.SampleTestFail)) self.suite.addTests(self.loader.loadTestsFromModule(tests.SampleTestBasic)) - self.results_output_buffer = StringIO.StringIO() - HTMLTestRunner.HTMLTestRunner(stream=self.results_output_buffer).run(self.suite) + self.results_output_buffer = StringIO() + HTMLTestRunner(stream=self.results_output_buffer).run(self.suite) self.byte_output = self.results_output_buffer.getvalue() def test_SampleTestPass(self): output1="".join(self.byte_output.split()) output2="".join(SampleTestPass.EXPECTED_RESULT.split()) self.assertGreater(output1.find(output2),0) + + @skip("Test Skipping") + def test_SampleTestSkip(self): + self.fail("This error should never be displayed") def test_SampleTestFail(self): output1="".join(self.byte_output.split()) @@ -42,8 +45,8 @@ def test_SampleTestBasic(self): def main(): - suite = unittest.TestLoader().loadTestsFromTestCase(TestHTMLTestRunner) - unittest.TextTestRunner().run(suite) + suite = TestLoader().loadTestsFromTestCase(TestHTMLTestRunner) + TextTestRunner().run(suite) if __name__ == "__main__": main()