diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/python2x/HTMLTestRunnerCN.py b/HTMLTestRunnerCN.py similarity index 83% rename from python2x/HTMLTestRunnerCN.py rename to HTMLTestRunnerCN.py index 7f6175c..45cf59c 100644 --- a/python2x/HTMLTestRunnerCN.py +++ b/HTMLTestRunnerCN.py @@ -6,23 +6,23 @@ The simplest way to use this is to invoke its main method. E.g. import unittest - import HTMLTestRunner + import HTMLTestReportCN ... define your tests ... if __name__ == '__main__': - HTMLTestRunner.main() + HTMLTestReportCN.main() -For more customization options, instantiates a HTMLTestRunner object. -HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g. +For more customization options, instantiates a HTMLTestReportCN object. +HTMLTestReportCN is a counterpart to unittest's TextTestRunner. E.g. # output to a file fp = file('my_report.html', 'wb') - runner = HTMLTestRunner.HTMLTestRunner( + runner = HTMLTestReportCN.HTMLTestReportCN( stream=fp, title='My unit test', - description='This demonstrates the report output by HTMLTestRunner.' + description='This demonstrates the report output by HTMLTestReportCN.' ) # Use an external stylesheet. @@ -35,6 +35,7 @@ ------------------------------------------------------------------------ Copyright (c) 2004-2007, Wai Yip Tung +Copyright (c) 2017, Findyou All rights reserved. Redistribution and use in source and binary forms, with or without @@ -66,11 +67,20 @@ # URL: http://tungwaiyip.info/software/HTMLTestRunner.html __author__ = "Wai Yip Tung, Findyou" -__version__ = "0.8.2.1" +__version__ = "0.8.3" """ Change History +Version 0.8.3 -Findyou 20171206 +* BUG fixed :错误的测试用例没有统计与显示 +* BUG fixed :当PASS的测试用例有print内容时,通过按钮显示为红色 +* 表格背景颜色根据用例结果显示颜色,优先级: 错误(黄色)>失败(红色)>通过(绿色) +* 合并文为HTMLTestRunner*N.py 同时支持python2,python3 + +Version 0.8.2.2 -Findyou +* HTMLTestRunnerEN.py 支持 python3.x +* HTMLTestRunnerEN.py 支持 python2.x Version 0.8.2.1 -Findyou * 支持中文,汉化 @@ -99,14 +109,20 @@ # TODO: simplify javascript using ,ore than 1 class in the class attribute? import datetime -import StringIO +try: + from StringIO import StringIO +except ImportError: + from io import StringIO import sys import time import unittest from xml.sax import saxutils -import sys -reload(sys) -sys.setdefaultencoding('utf-8') + +try: + reload(sys) + sys.setdefaultencoding('utf-8') +except NameError: + pass # ------------------------------------------------------------------------ # The redirectors below are used to capture output during testing. Output @@ -185,9 +201,9 @@ class Template_mixin(object): 2: '错误', } - DEFAULT_TITLE = '单元测试报告' + DEFAULT_TITLE = '测试报告' DEFAULT_DESCRIPTION = '' - DEFAULT_TESTER='最棒QA' + DEFAULT_TESTER='QA' # ------------------------------------------------------------------------ # HTML Template @@ -205,22 +221,34 @@ class Template_mixin(object): %(stylesheet)s +%(heading)s +%(report)s +%(ending)s -%(heading)s -%(report)s -%(ending)s - """ @@ -308,7 +344,7 @@ class Template_mixin(object): STYLESHEET_TMPL = """ + + + +
+

自动化测试报告

+

测试人员 : Findyou

+

开始时间 : 2017-12-30 11:47:00

+

合计耗时 : 0:00:00.001146

+

测试结果 : 共 12,通过 6,失败 4,错误 2,通过率= 50.00%

+ +

+
+ + + +

+概要{ 50.00% } +通过{ 6 } +失败{ 4 } +错误{ 2 } +所有{ 12 } +

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
用例集/测试用例总计通过失败错误详细
MyTestCase6222详细
testCase1
testCase2
+ + + + +
+
+    
+ft1_2: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 21, in testCase2
+    self.assertEqual(2,3,"testCase_Fail")
+AssertionError: testCase_Fail
+
+
+    
+
+
testCase3
+ + + + +
+
+    
+ft1_3: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 24, in testCase3
+    self.assertEqual(2,5,"测试用例_不通过")
+AssertionError: 测试用例_不通过
+
+
+    
+
+
testCase4
+ + + + +
+
+    
+et1_4: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 28, in testCase4
+    testCase_Error
+NameError: global name 'testCase_Error' is not defined
+
+
+    
+
+
testCase5
testCase6
+ + + + +
+
+    
+et1_6: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 35, in testCase6
+    Findyou
+NameError: global name 'Findyou' is not defined
+
+
+    
+
+
APITestCase6420详细
testCase1
+ + + + +
+
+    
+pt2_1: 测试打印日志~
+
+
+    
+
+
testCase2
+ + + + +
+
+    
+pt2_2: 测试打印日志~
+
+
+    
+
+
testCase3
testCase4
+ + + + +
+
+    
+ft2_4: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 56, in testCase4
+    self.assertEqual(2, 1, "测试用例_不通过")
+AssertionError: 测试用例_不通过
+
+
+    
+
+
testCase5
+ + + + +
+
+    
+ft2_5: Traceback (most recent call last):
+  File "test_HTMLTestRunnerCN.py", line 59, in testCase5
+    self.assertEqual(2, 9, "测试用例_不通过")
+AssertionError: 测试用例_不通过
+
+
+    
+
+
testCase6
总计12642通过率:50.00%
+ +
 
+
+
+ + + + diff --git a/Report_CN.html b/ReportEN.html similarity index 52% rename from Report_CN.html rename to ReportEN.html index 7d415aa..8ebeb70 100644 --- a/Report_CN.html +++ b/ReportEN.html @@ -3,14 +3,14 @@ 自动化测试报告 - + - - - - -
-

{ Test Report }

-

Tester : Findyou

-

Start Time : 2017-05-31 13:01:29

-

Duration : 0:00:00.001000

-

Status : ALL 11 Pass 6 Failure 5, Passing rate: 54.55%

- -

-
- - - -

-Summary{ 54.55% } -Failed{ 5 } -Passed{ 6 } -ALL{ 11 } -

- -------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Test Group/Test caseCountPassFailErrorView
MyTestCase5230Detail
testCase1
pass
testCase2
- - - - -
-
-    
-ft1_2: Traceback (most recent call last):
-  File "test_HTMLTestRunnerEN.py", line 23, in testCase2
-    self.assertEqual(2,3,"testError")
-AssertionError: testError
-
-
-    
-
-
testCase3
- - - - -
-
-    
-ft1_3: Traceback (most recent call last):
-  File "test_HTMLTestRunnerEN.py", line 26, in testCase3
-    self.assertEqual(2,5,"测试错误")
-AssertionError: 测试错误
-
-
-    
-
-
testCase4
- - - - -
-
-    
-ft1_4: Traceback (most recent call last):
-  File "test_HTMLTestRunnerEN.py", line 29, in testCase4
-    self.assertEqual(2,1,"测试错误")
-AssertionError: 测试错误
-
-
-    
-
-
testCase5
pass
APITestCase6420Detail
testCase1
pass
testCase2
pass
testCase3
pass
testCase4
- - - - -
-
-    
-ft2_4: Traceback (most recent call last):
-  File "test_HTMLTestRunnerEN.py", line 51, in testCase4
-    self.assertEqual(2, 1, "测试错误")
-AssertionError: 测试错误
-
-
-    
-
-
testCase5
- - - - -
-
-    
-ft2_5: Traceback (most recent call last):
-  File "test_HTMLTestRunnerEN.py", line 54, in testCase5
-    self.assertEqual(2, 6, "testError")
-AssertionError: testError
-
-
-    
-
-
testCase6
pass
Total11650Passing rate: 54.55%
- -
 
-
-
- - - - diff --git a/Report_EN.png b/Report_EN.png deleted file mode 100644 index a54c3d8..0000000 Binary files a/Report_EN.png and /dev/null differ diff --git a/python2x/test_HTMLTestRunnerCN.py b/python2x/test_HTMLTestRunnerCN.py deleted file mode 100644 index 8e564e7..0000000 --- a/python2x/test_HTMLTestRunnerCN.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding:utf-8 -*- - -import unittest -import HTMLTestRunnerCN - - - -#测试用例 - -class MyTestCase(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - - def testCase1(self): - self.assertEqual(2,2,"testError") - - - def testCase2(self): - self.assertEqual(2,3,"testError") - - def testCase3(self): - self.assertEqual(2,5,"测试错误") - - def testCase4(self): - self.assertEqual(2,1,"测试错误") - - def testCase5(self): - pass - -class APITestCase(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def testCase1(self): - self.assertEqual(2, 2, "testError") - - def testCase2(self): - self.assertEqual(3, 3, "testError") - - def testCase3(self): - self.assertEqual(5, 5, "testError") - - def testCase4(self): - self.assertEqual(2, 1, "测试错误") - - def testCase5(self): - self.assertEqual(2, 9, "testError") - - def testCase6(self): - pass - -#添加Suite -def Suite(): - #定义一个单元测试容器 - suiteTest = unittest.TestSuite() - #将测试用例加入到容器 - suiteTest.addTest(MyTestCase("testCase1")) - suiteTest.addTest(MyTestCase("testCase2")) - suiteTest.addTest(MyTestCase("testCase3")) - suiteTest.addTest(MyTestCase("testCase4")) - suiteTest.addTest(MyTestCase("testCase5")) - suiteTest.addTest(APITestCase("testCase1")) - suiteTest.addTest(APITestCase("testCase2")) - suiteTest.addTest(APITestCase("testCase3")) - suiteTest.addTest(APITestCase("testCase4")) - suiteTest.addTest(APITestCase("testCase5")) - suiteTest.addTest(APITestCase("testCase6")) - return suiteTest - -''' -问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 -其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执行测试用例,这种情况下,执行的只是用例或者套件,而不是整个文件,写在main里的代码是不会被执行的!!自然无法生成测试报告 -我们在如果想要生成测试报告,那么一定要注意右键执行时选择的右键菜单,一定要当做文件执行,不要让编辑器当做用例执行 -if __name__ == ‘__main__‘: -if __name__ == ‘python‘: -# 把main修改成自己的文件夹名就可以了 - ----试了不行 -''' -if __name__ == '__main__': - #确定生成报告的路径 - filePath ='F:\\HTMLTestRunnerCN.html' - fp = file(filePath,'wb') - #生成报告的Title,描述 - runner = HTMLTestRunnerCN.HTMLTestRunner( - stream=fp, - title=u'自动化测试报告', - #description='详细测试用例结果', - tester=u"Findyou" - ) - #运行测试用例 - runner.run(Suite()) - # 关闭文件,否则会无法生成文件 - #fp.close() \ No newline at end of file diff --git a/python2x/test_HTMLTestRunnerEN.py b/python2x/test_HTMLTestRunnerEN.py deleted file mode 100644 index 2749d67..0000000 --- a/python2x/test_HTMLTestRunnerEN.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding:utf-8 -*- - -import unittest -import HTMLTestRunnerEN - - - -#测试用例 - -class MyTestCase(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - - def testCase1(self): - self.assertEqual(2,2,"testError") - - - def testCase2(self): - self.assertEqual(2,3,"testError") - - def testCase3(self): - self.assertEqual(2,5,"测试错误") - - def testCase4(self): - self.assertEqual(2,1,"测试错误") - - def testCase5(self): - pass - -class APITestCase(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def testCase1(self): - self.assertEqual(2, 2, "testError") - - def testCase2(self): - self.assertEqual(3, 3, "testError") - - def testCase3(self): - self.assertEqual(5, 5, "testError") - - def testCase4(self): - self.assertEqual(2, 1, "测试错误") - - def testCase5(self): - self.assertEqual(2, 6, "testError") - - def testCase6(self): - pass - -#添加Suite -def Suite(): - #定义一个单元测试容器 - suiteTest = unittest.TestSuite() - #将测试用例加入到容器 - suiteTest.addTest(MyTestCase("testCase1")) - suiteTest.addTest(MyTestCase("testCase2")) - suiteTest.addTest(MyTestCase("testCase3")) - suiteTest.addTest(MyTestCase("testCase4")) - suiteTest.addTest(MyTestCase("testCase5")) - suiteTest.addTest(APITestCase("testCase1")) - suiteTest.addTest(APITestCase("testCase2")) - suiteTest.addTest(APITestCase("testCase3")) - suiteTest.addTest(APITestCase("testCase4")) - suiteTest.addTest(APITestCase("testCase5")) - suiteTest.addTest(APITestCase("testCase6")) - return suiteTest - -''' -问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 -其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执行测试用例,这种情况下,执行的只是用例或者套件,而不是整个文件,写在main里的代码是不会被执行的!!自然无法生成测试报告 -我们在如果想要生成测试报告,那么一定要注意右键执行时选择的右键菜单,一定要当做文件执行,不要让编辑器当做用例执行 -if __name__ == ‘__main__‘: -if __name__ == ‘python‘: -# 把main修改成自己的文件夹名就可以了 - ----试了不行 -''' -if __name__ == '__main__': - #确定生成报告的路径 - filePath ='F:\\HTMLTestRunnerEN.html' - fp = file(filePath,'wb') - #生成报告的Title,描述 - runner = HTMLTestRunnerEN.HTMLTestRunner( - stream=fp, - title=u'{ Test Report }', - #description='详细测试用例结果', - tester=u"Findyou" - ) - #运行测试用例 - runner.run(Suite()) - # 关闭文件,否则会无法生成文件 - #fp.close() \ No newline at end of file diff --git a/python3x/HTMLTestReportCN.py b/python3x/HTMLTestReportCN.py deleted file mode 100644 index 6b20537..0000000 --- a/python3x/HTMLTestReportCN.py +++ /dev/null @@ -1,776 +0,0 @@ -#coding=utf-8 -""" -A TestRunner for use with the Python unit testing framework. It -generates a HTML report to show the result at a glance. - -The simplest way to use this is to invoke its main method. E.g. - - import unittest - import HTMLTestRunner - - ... define your tests ... - - if __name__ == '__main__': - HTMLTestRunner.main() - - -For more customization options, instantiates a HTMLTestRunner object. -HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g. - - # output to a file - fp = file('my_report.html', 'wb') - runner = HTMLTestRunner.HTMLTestRunner( - stream=fp, - title='My unit test', - description='This demonstrates the report output by HTMLTestRunner.' - ) - - # Use an external stylesheet. - # See the Template_mixin class for more customizable options - runner.STYLESHEET_TMPL = '' - - # run the test - runner.run(my_test_suite) - - ------------------------------------------------------------------------- -Copyright (c) 2004-2007, Wai Yip Tung -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name Wai Yip Tung nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" - -# URL: http://tungwaiyip.info/software/HTMLTestRunner.html - -__author__ = "Wai Yip Tung, Findyou" -__version__ = "0.8.2.2" - - -""" -Change History -Version 0.8.2.1 -Findyou -* 改为支持python3 - -Version 0.8.2.1 -Findyou -* 支持中文,汉化 -* 调整样式,美化(需要连入网络,使用的百度的Bootstrap.js) -* 增加 通过分类显示、测试人员、通过率的展示 -* 优化“详细”与“收起”状态的变换 -* 增加返回顶部的锚点 - -Version 0.8.2 -* Show output inline instead of popup window (Viorel Lupu). - -Version in 0.8.1 -* Validated XHTML (Wolfgang Borgert). -* Added description of test classes and test cases. - -Version in 0.8.0 -* Define Template_mixin class for customization. -* Workaround a IE 6 bug that it does not treat - - %(stylesheet)s - - - -%(heading)s -%(report)s -%(ending)s - - - -""" - # variables: (title, generator, stylesheet, heading, report, ending) - - - # ------------------------------------------------------------------------ - # Stylesheet - # - # alternatively use a for external style sheet, e.g. - # - - STYLESHEET_TMPL = """ - -""" - - # ------------------------------------------------------------------------ - # Heading - # - - HEADING_TMPL = """
-

%(title)s

-%(parameters)s -

%(description)s

-
- -""" # variables: (title, parameters, description) - - HEADING_ATTRIBUTE_TMPL = """

%(name)s : %(value)s

-""" # variables: (name, value) - - - - # ------------------------------------------------------------------------ - # Report - # - # 汉化,加美化效果 --Findyou - REPORT_TMPL = """ -

-概要{ %(passrate)s } -失败{ %(fail)s } -通过{ %(Pass)s } -所有{ %(count)s } -

- -------- - - - - - - - - -%(test_list)s - - - - - - - - -
用例集/测试用例总计通过失败错误详细
总计%(count)s%(Pass)s%(fail)s%(error)s通过率:%(passrate)s
-""" # variables: (test_list, count, Pass, fail, error ,passrate) - - REPORT_CLASS_TMPL = r""" - - %(desc)s - %(count)s - %(Pass)s - %(fail)s - %(error)s - 详细 - -""" # variables: (style, desc, count, Pass, fail, error, cid) - - #失败 的样式,去掉原来JS效果,美化展示效果 -Findyou - REPORT_TEST_WITH_OUTPUT_TMPL = r""" - -
%(desc)s
- - - - - -
-
-    %(script)s
-    
-
- - -""" # variables: (tid, Class, style, desc, status) - - # 通过 的样式,加标签效果 -Findyou - REPORT_TEST_NO_OUTPUT_TMPL = r""" - -
%(desc)s
- %(status)s - -""" # variables: (tid, Class, style, desc, status) - - REPORT_TEST_OUTPUT_TMPL = r""" -%(id)s: %(output)s -""" # variables: (id, output) - - # ------------------------------------------------------------------------ - # ENDING - # - # 增加返回顶部按钮 --Findyou - ENDING_TMPL = """
 
-
-
- """ - -# -------------------- The end of the Template class ------------------- - - -TestResult = unittest.TestResult - -class _TestResult(TestResult): - # note: _TestResult is a pure representation of results. - # It lacks the output and reporting ability compares to unittest._TextTestResult. - - def __init__(self, verbosity=1): - TestResult.__init__(self) - self.stdout0 = None - self.stderr0 = None - self.success_count = 0 - self.failure_count = 0 - self.error_count = 0 - self.verbosity = verbosity - - # result is a list of result in 4 tuple - # ( - # result code (0: success; 1: fail; 2: error), - # TestCase object, - # Test output (byte string), - # stack trace, - # ) - self.result = [] - #增加一个测试通过率 --Findyou - self.passrate=float(0) - - - def startTest(self, test): - TestResult.startTest(self, test) - # just one buffer for both stdout and stderr - self.outputBuffer = io.StringIO() - stdout_redirector.fp = self.outputBuffer - stderr_redirector.fp = self.outputBuffer - self.stdout0 = sys.stdout - self.stderr0 = sys.stderr - sys.stdout = stdout_redirector - sys.stderr = stderr_redirector - - - def complete_output(self): - """ - Disconnect output redirection and return buffer. - Safe to call multiple times. - """ - if self.stdout0: - sys.stdout = self.stdout0 - sys.stderr = self.stderr0 - self.stdout0 = None - self.stderr0 = None - return self.outputBuffer.getvalue() - - - def stopTest(self, test): - # Usually one of addSuccess, addError or addFailure would have been called. - # But there are some path in unittest that would bypass this. - # We must disconnect stdout in stopTest(), which is guaranteed to be called. - self.complete_output() - - - def addSuccess(self, test): - self.success_count += 1 - TestResult.addSuccess(self, test) - output = self.complete_output() - self.result.append((0, test, output, '')) - if self.verbosity > 1: - sys.stderr.write('ok ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('.') - - def addError(self, test, err): - self.error_count += 1 - TestResult.addError(self, test, err) - _, _exc_str = self.errors[-1] - output = self.complete_output() - self.result.append((2, test, output, _exc_str)) - if self.verbosity > 1: - sys.stderr.write('E ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('E') - - def addFailure(self, test, err): - self.failure_count += 1 - TestResult.addFailure(self, test, err) - _, _exc_str = self.failures[-1] - output = self.complete_output() - self.result.append((1, test, output, _exc_str)) - if self.verbosity > 1: - sys.stderr.write('F ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('F') - - -class HTMLTestRunner(Template_mixin): - """ - """ - def __init__(self, stream=sys.stdout, verbosity=1,title=None,description=None,tester=None): - self.stream = stream - self.verbosity = verbosity - if title is None: - self.title = self.DEFAULT_TITLE - else: - self.title = title - if description is None: - self.description = self.DEFAULT_DESCRIPTION - else: - self.description = description - if tester is None: - self.tester = self.DEFAULT_TESTER - else: - self.tester = tester - - self.startTime = datetime.datetime.now() - - - def run(self, test): - "Run the given test case or test suite." - result = _TestResult(self.verbosity) - test(result) - self.stopTime = datetime.datetime.now() - self.generateReport(test, result) - print('\nTime Elapsed: %s' % (self.stopTime-self.startTime), file=sys.stderr) - return result - - - def sortResult(self, result_list): - # unittest does not seems to run in any particular order. - # Here at least we want to group them together by class. - rmap = {} - classes = [] - for n,t,o,e in result_list: - cls = t.__class__ - if cls not in rmap: - rmap[cls] = [] - classes.append(cls) - rmap[cls].append((n,t,o,e)) - r = [(cls, rmap[cls]) for cls in classes] - return r - - #替换测试结果status为通过率 --Findyou - def getReportAttributes(self, result): - """ - Return report attributes as a list of (name, value). - Override this to add custom attributes. - """ - startTime = str(self.startTime)[:19] - duration = str(self.stopTime - self.startTime) - status = [] - status.append('共 %s' % (result.success_count + result.failure_count + result.error_count)) - if result.success_count: status.append('通过 %s' % result.success_count) - if result.failure_count: status.append('失败 %s' % result.failure_count) - if result.error_count: status.append('错误 %s' % result.error_count ) - if status: - status = ','.join(status) - self.passrate = str("%.2f%%" % (float(result.success_count) / float(result.success_count + result.failure_count + result.error_count) * 100)) - else: - status = 'none' - return [ - ('测试人员', self.tester), - ('开始时间',startTime), - ('合计耗时',duration), - ('测试结果',status + ",通过率= "+self.passrate), - ] - - - def generateReport(self, test, result): - report_attrs = self.getReportAttributes(result) - generator = 'HTMLTestRunner %s' % __version__ - stylesheet = self._generate_stylesheet() - heading = self._generate_heading(report_attrs) - report = self._generate_report(result) - ending = self._generate_ending() - output = self.HTML_TMPL % dict( - title = saxutils.escape(self.title), - generator = generator, - stylesheet = stylesheet, - heading = heading, - report = report, - ending = ending, - ) - self.stream.write(output.encode('utf8')) - - - def _generate_stylesheet(self): - return self.STYLESHEET_TMPL - - #增加Tester显示 -Findyou - def _generate_heading(self, report_attrs): - a_lines = [] - for name, value in report_attrs: - line = self.HEADING_ATTRIBUTE_TMPL % dict( - name = saxutils.escape(name), - value = saxutils.escape(value), - ) - a_lines.append(line) - heading = self.HEADING_TMPL % dict( - title = saxutils.escape(self.title), - parameters = ''.join(a_lines), - description = saxutils.escape(self.description), - tester= saxutils.escape(self.tester), - ) - return heading - - #生成报告 --Findyou添加注释 - def _generate_report(self, result): - rows = [] - sortedResult = self.sortResult(result.result) - for cid, (cls, cls_results) in enumerate(sortedResult): - # subtotal for a class - np = nf = ne = 0 - for n,t,o,e in cls_results: - if n == 0: np += 1 - elif n == 1: nf += 1 - else: ne += 1 - - # format class description - if cls.__module__ == "__main__": - name = cls.__name__ - else: - name = "%s.%s" % (cls.__module__, cls.__name__) - doc = cls.__doc__ and cls.__doc__.split("\n")[0] or "" - 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', - desc = desc, - count = np+nf+ne, - Pass = np, - fail = nf, - error = ne, - cid = 'c%s' % (cid+1), - ) - rows.append(row) - - for tid, (n,t,o,e) in enumerate(cls_results): - self._generate_report_test(rows, cid, tid, n, t, o, e) - - report = self.REPORT_TMPL % dict( - test_list = ''.join(rows), - count = str(result.success_count+result.failure_count+result.error_count), - Pass = str(result.success_count), - fail = str(result.failure_count), - error = str(result.error_count), - passrate =self.passrate, - ) - return report - - - def _generate_report_test(self, rows, cid, tid, n, t, o, e): - # e.g. 'pt1.1', 'ft1.1', etc - has_output = bool(o or e) - # ID修改点为下划线,支持Bootstrap折叠展开特效 - Findyou - tid = (n == 0 and 'p' or 'f') + 't%s_%s' % (cid+1,tid+1) - name = t.id().split('.')[-1] - doc = t.shortDescription() or "" - desc = doc and ('%s: %s' % (name, doc)) or name - tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL - - # utf-8 支持中文 - Findyou - # o and e should be byte string because they are collected from stdout and stderr? - if isinstance(o, str): - # TODO: some problem with 'string_escape': it escape \n and mess up formating - # uo = unicode(o.encode('string_escape')) - # uo = o.decode('latin-1') - uo = o - else: - uo = o - if isinstance(e, str): - # TODO: some problem with 'string_escape': it escape \n and mess up formating - # ue = unicode(e.encode('string_escape')) - # ue = e.decode('latin-1') - ue = e - else: - ue = e - - script = self.REPORT_TEST_OUTPUT_TMPL % dict( - id = tid, - output = saxutils.escape(uo+ue), - ) - - row = tmpl % dict( - tid = tid, - Class = (n == 0 and 'hiddenRow' or 'none'), - style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'passCase'), - desc = desc, - script = script, - status = self.STATUS[n], - ) - rows.append(row) - if not has_output: - return - - def _generate_ending(self): - return self.ENDING_TMPL - - -############################################################################## -# Facilities for running tests from the command line -############################################################################## - -# Note: Reuse unittest.TestProgram to launch test. In the future we may -# build our own launcher to support more specific command line -# parameters like test title, CSS, etc. -class TestProgram(unittest.TestProgram): - """ - A variation of the unittest.TestProgram. Please refer to the base - class for command line parameters. - """ - def runTests(self): - # Pick HTMLTestRunner as the default test runner. - # base class's testRunner parameter is not useful because it means - # we have to instantiate HTMLTestRunner before we know self.verbosity. - if self.testRunner is None: - self.testRunner = HTMLTestRunner(verbosity=self.verbosity) - unittest.TestProgram.runTests(self) - -main = TestProgram - -############################################################################## -# Executing this module from the command line -############################################################################## - -if __name__ == "__main__": - main(module=None) diff --git a/python3x/HTMLTestReportEN.py b/python3x/HTMLTestReportEN.py deleted file mode 100644 index 3399b4c..0000000 --- a/python3x/HTMLTestReportEN.py +++ /dev/null @@ -1,776 +0,0 @@ -#coding=utf-8 -""" -A TestRunner for use with the Python unit testing framework. It -generates a HTML report to show the result at a glance. - -The simplest way to use this is to invoke its main method. E.g. - - import unittest - import HTMLTestRunner - - ... define your tests ... - - if __name__ == '__main__': - HTMLTestRunner.main() - - -For more customization options, instantiates a HTMLTestRunner object. -HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g. - - # output to a file - fp = file('my_report.html', 'wb') - runner = HTMLTestRunner.HTMLTestRunner( - stream=fp, - title='My unit test', - description='This demonstrates the report output by HTMLTestRunner.' - ) - - # Use an external stylesheet. - # See the Template_mixin class for more customizable options - runner.STYLESHEET_TMPL = '' - - # run the test - runner.run(my_test_suite) - - ------------------------------------------------------------------------- -Copyright (c) 2004-2007, Wai Yip Tung -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name Wai Yip Tung nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -""" - -# URL: http://tungwaiyip.info/software/HTMLTestRunner.html - -__author__ = "Wai Yip Tung, Findyou" -__version__ = "0.8.2.2" - - -""" -Change History -Version 0.8.2.1 -Findyou -* 改为支持python3 - -Version 0.8.2.1 -Findyou -* 支持中文,汉化 -* 调整样式,美化(需要连入网络,使用的百度的Bootstrap.js) -* 增加 通过分类显示、测试人员、通过率的展示 -* 优化“详细”与“收起”状态的变换 -* 增加返回顶部的锚点 - -Version 0.8.2 -* Show output inline instead of popup window (Viorel Lupu). - -Version in 0.8.1 -* Validated XHTML (Wolfgang Borgert). -* Added description of test classes and test cases. - -Version in 0.8.0 -* Define Template_mixin class for customization. -* Workaround a IE 6 bug that it does not treat - - %(stylesheet)s - - - -%(heading)s -%(report)s -%(ending)s - - - -""" - # variables: (title, generator, stylesheet, heading, report, ending) - - - # ------------------------------------------------------------------------ - # Stylesheet - # - # alternatively use a for external style sheet, e.g. - # - - STYLESHEET_TMPL = """ - -""" - - # ------------------------------------------------------------------------ - # Heading - # - - HEADING_TMPL = """
-

%(title)s

-%(parameters)s -

%(description)s

-
- -""" # variables: (title, parameters, description) - - HEADING_ATTRIBUTE_TMPL = """

%(name)s : %(value)s

-""" # variables: (name, value) - - - - # ------------------------------------------------------------------------ - # Report - # - # 汉化,加美化效果 --Findyou - REPORT_TMPL = """ -

-Summary{ %(passrate)s } -Failed{ %(fail)s } -Passed{ %(Pass)s } -ALL{ %(count)s } -

- -------- - - - - - - - - -%(test_list)s - - - - - - - - -
Test Group/Test caseCountPassFailErrorView
Total%(count)s%(Pass)s%(fail)s%(error)sPassing rate: %(passrate)s
-""" # variables: (test_list, count, Pass, fail, error ,passrate) - - REPORT_CLASS_TMPL = r""" - - %(desc)s - %(count)s - %(Pass)s - %(fail)s - %(error)s - Detail - -""" # variables: (style, desc, count, Pass, fail, error, cid) - - #失败 的样式,去掉原来JS效果,美化展示效果 -Findyou - REPORT_TEST_WITH_OUTPUT_TMPL = r""" - -
%(desc)s
- - - - - -
-
-    %(script)s
-    
-
- - -""" # variables: (tid, Class, style, desc, status) - - # 通过 的样式,加标签效果 -Findyou - REPORT_TEST_NO_OUTPUT_TMPL = r""" - -
%(desc)s
- %(status)s - -""" # variables: (tid, Class, style, desc, status) - - REPORT_TEST_OUTPUT_TMPL = r""" -%(id)s: %(output)s -""" # variables: (id, output) - - # ------------------------------------------------------------------------ - # ENDING - # - # 增加返回顶部按钮 --Findyou - ENDING_TMPL = """
 
-
-
- """ - -# -------------------- The end of the Template class ------------------- - - -TestResult = unittest.TestResult - -class _TestResult(TestResult): - # note: _TestResult is a pure representation of results. - # It lacks the output and reporting ability compares to unittest._TextTestResult. - - def __init__(self, verbosity=1): - TestResult.__init__(self) - self.stdout0 = None - self.stderr0 = None - self.success_count = 0 - self.failure_count = 0 - self.error_count = 0 - self.verbosity = verbosity - - # result is a list of result in 4 tuple - # ( - # result code (0: success; 1: fail; 2: error), - # TestCase object, - # Test output (byte string), - # stack trace, - # ) - self.result = [] - #增加一个测试通过率 --Findyou - self.passrate=float(0) - - - def startTest(self, test): - TestResult.startTest(self, test) - # just one buffer for both stdout and stderr - self.outputBuffer = io.StringIO() - stdout_redirector.fp = self.outputBuffer - stderr_redirector.fp = self.outputBuffer - self.stdout0 = sys.stdout - self.stderr0 = sys.stderr - sys.stdout = stdout_redirector - sys.stderr = stderr_redirector - - - def complete_output(self): - """ - Disconnect output redirection and return buffer. - Safe to call multiple times. - """ - if self.stdout0: - sys.stdout = self.stdout0 - sys.stderr = self.stderr0 - self.stdout0 = None - self.stderr0 = None - return self.outputBuffer.getvalue() - - - def stopTest(self, test): - # Usually one of addSuccess, addError or addFailure would have been called. - # But there are some path in unittest that would bypass this. - # We must disconnect stdout in stopTest(), which is guaranteed to be called. - self.complete_output() - - - def addSuccess(self, test): - self.success_count += 1 - TestResult.addSuccess(self, test) - output = self.complete_output() - self.result.append((0, test, output, '')) - if self.verbosity > 1: - sys.stderr.write('ok ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('.') - - def addError(self, test, err): - self.error_count += 1 - TestResult.addError(self, test, err) - _, _exc_str = self.errors[-1] - output = self.complete_output() - self.result.append((2, test, output, _exc_str)) - if self.verbosity > 1: - sys.stderr.write('E ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('E') - - def addFailure(self, test, err): - self.failure_count += 1 - TestResult.addFailure(self, test, err) - _, _exc_str = self.failures[-1] - output = self.complete_output() - self.result.append((1, test, output, _exc_str)) - if self.verbosity > 1: - sys.stderr.write('F ') - sys.stderr.write(str(test)) - sys.stderr.write('\n') - else: - sys.stderr.write('F') - - -class HTMLTestRunner(Template_mixin): - """ - """ - def __init__(self, stream=sys.stdout, verbosity=1,title=None,description=None,tester=None): - self.stream = stream - self.verbosity = verbosity - if title is None: - self.title = self.DEFAULT_TITLE - else: - self.title = title - if description is None: - self.description = self.DEFAULT_DESCRIPTION - else: - self.description = description - if tester is None: - self.tester = self.DEFAULT_TESTER - else: - self.tester = tester - - self.startTime = datetime.datetime.now() - - - def run(self, test): - "Run the given test case or test suite." - result = _TestResult(self.verbosity) - test(result) - self.stopTime = datetime.datetime.now() - self.generateReport(test, result) - print('\nTime Elapsed: %s' % (self.stopTime-self.startTime), file=sys.stderr) - return result - - - def sortResult(self, result_list): - # unittest does not seems to run in any particular order. - # Here at least we want to group them together by class. - rmap = {} - classes = [] - for n,t,o,e in result_list: - cls = t.__class__ - if cls not in rmap: - rmap[cls] = [] - classes.append(cls) - rmap[cls].append((n,t,o,e)) - r = [(cls, rmap[cls]) for cls in classes] - return r - - #替换测试结果status为通过率 --Findyou - def getReportAttributes(self, result): - """ - Return report attributes as a list of (name, value). - Override this to add custom attributes. - """ - startTime = str(self.startTime)[:19] - duration = str(self.stopTime - self.startTime) - status = [] - status.append('ALL %s' % (result.success_count + result.failure_count + result.error_count)) - if result.success_count: status.append('Pass %s' % result.success_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: - status = ' '.join(status) - self.passrate = str("%.2f%%" % (float(result.success_count) / float(result.success_count + result.failure_count + result.error_count) * 100)) - else: - status = 'none' - return [ - ('Tester', self.tester), - ('Start Time', startTime), - ('Duration', duration), - ('Status',status + ", Passing rate: "+self.passrate), - ] - - - def generateReport(self, test, result): - report_attrs = self.getReportAttributes(result) - generator = 'HTMLTestRunner %s' % __version__ - stylesheet = self._generate_stylesheet() - heading = self._generate_heading(report_attrs) - report = self._generate_report(result) - ending = self._generate_ending() - output = self.HTML_TMPL % dict( - title = saxutils.escape(self.title), - generator = generator, - stylesheet = stylesheet, - heading = heading, - report = report, - ending = ending, - ) - self.stream.write(output.encode('utf8')) - - - def _generate_stylesheet(self): - return self.STYLESHEET_TMPL - - #增加Tester显示 -Findyou - def _generate_heading(self, report_attrs): - a_lines = [] - for name, value in report_attrs: - line = self.HEADING_ATTRIBUTE_TMPL % dict( - name = saxutils.escape(name), - value = saxutils.escape(value), - ) - a_lines.append(line) - heading = self.HEADING_TMPL % dict( - title = saxutils.escape(self.title), - parameters = ''.join(a_lines), - description = saxutils.escape(self.description), - tester= saxutils.escape(self.tester), - ) - return heading - - #生成报告 --Findyou添加注释 - def _generate_report(self, result): - rows = [] - sortedResult = self.sortResult(result.result) - for cid, (cls, cls_results) in enumerate(sortedResult): - # subtotal for a class - np = nf = ne = 0 - for n,t,o,e in cls_results: - if n == 0: np += 1 - elif n == 1: nf += 1 - else: ne += 1 - - # format class description - if cls.__module__ == "__main__": - name = cls.__name__ - else: - name = "%s.%s" % (cls.__module__, cls.__name__) - doc = cls.__doc__ and cls.__doc__.split("\n")[0] or "" - 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', - desc = desc, - count = np+nf+ne, - Pass = np, - fail = nf, - error = ne, - cid = 'c%s' % (cid+1), - ) - rows.append(row) - - for tid, (n,t,o,e) in enumerate(cls_results): - self._generate_report_test(rows, cid, tid, n, t, o, e) - - report = self.REPORT_TMPL % dict( - test_list = ''.join(rows), - count = str(result.success_count+result.failure_count+result.error_count), - Pass = str(result.success_count), - fail = str(result.failure_count), - error = str(result.error_count), - passrate =self.passrate, - ) - return report - - - def _generate_report_test(self, rows, cid, tid, n, t, o, e): - # e.g. 'pt1.1', 'ft1.1', etc - has_output = bool(o or e) - # ID修改点为下划线,支持Bootstrap折叠展开特效 - Findyou - tid = (n == 0 and 'p' or 'f') + 't%s_%s' % (cid+1,tid+1) - name = t.id().split('.')[-1] - doc = t.shortDescription() or "" - desc = doc and ('%s: %s' % (name, doc)) or name - tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL - - # utf-8 支持中文 - Findyou - # o and e should be byte string because they are collected from stdout and stderr? - if isinstance(o, str): - # TODO: some problem with 'string_escape': it escape \n and mess up formating - # uo = unicode(o.encode('string_escape')) - # uo = o.decode('latin-1') - uo = o - else: - uo = o - if isinstance(e, str): - # TODO: some problem with 'string_escape': it escape \n and mess up formating - # ue = unicode(e.encode('string_escape')) - # ue = e.decode('latin-1') - ue = e - else: - ue = e - - script = self.REPORT_TEST_OUTPUT_TMPL % dict( - id = tid, - output = saxutils.escape(uo+ue), - ) - - row = tmpl % dict( - tid = tid, - Class = (n == 0 and 'hiddenRow' or 'none'), - style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'passCase'), - desc = desc, - script = script, - status = self.STATUS[n], - ) - rows.append(row) - if not has_output: - return - - def _generate_ending(self): - return self.ENDING_TMPL - - -############################################################################## -# Facilities for running tests from the command line -############################################################################## - -# Note: Reuse unittest.TestProgram to launch test. In the future we may -# build our own launcher to support more specific command line -# parameters like test title, CSS, etc. -class TestProgram(unittest.TestProgram): - """ - A variation of the unittest.TestProgram. Please refer to the base - class for command line parameters. - """ - def runTests(self): - # Pick HTMLTestRunner as the default test runner. - # base class's testRunner parameter is not useful because it means - # we have to instantiate HTMLTestRunner before we know self.verbosity. - if self.testRunner is None: - self.testRunner = HTMLTestRunner(verbosity=self.verbosity) - unittest.TestProgram.runTests(self) - -main = TestProgram - -############################################################################## -# Executing this module from the command line -############################################################################## - -if __name__ == "__main__": - main(module=None) diff --git a/python3x/test_HTMLTestReportCN.py b/test_HTMLTestRunnerCN.py similarity index 57% rename from python3x/test_HTMLTestReportCN.py rename to test_HTMLTestRunnerCN.py index c03cf5b..cb977f8 100644 --- a/python3x/test_HTMLTestReportCN.py +++ b/test_HTMLTestRunnerCN.py @@ -1,7 +1,7 @@ # -*- coding:utf-8 -*- import unittest -import HTMLTestReportCN +import HTMLTestRunnerCN @@ -14,23 +14,26 @@ def setUp(self): def tearDown(self): pass - def testCase1(self): - self.assertEqual(2,2,"testError") - + self.assertEqual(2,2,"testCase_Pass") def testCase2(self): - self.assertEqual(2,3,"testError") + self.assertEqual(2,3,"testCase_Fail") def testCase3(self): - self.assertEqual(2,5,"测试错误") + self.assertEqual(2,5,"测试用例_不通过") def testCase4(self): - self.assertEqual(2,1,"测试错误") + self.assertEqual(2,2,"testCase_Error") + testCase_Error def testCase5(self): pass + def testCase6(self): + self.assertEqual(2,2,"testCase_Error") + Findyou + class APITestCase(unittest.TestCase): def setUp(self): pass @@ -39,19 +42,21 @@ def tearDown(self): pass def testCase1(self): - self.assertEqual(2, 2, "testError") + self.assertEqual(2, 2, "testCase_Pass") + print("测试打印日志~") def testCase2(self): - self.assertEqual(3, 3, "testError") + self.assertEqual(3, 3, "testCase_Pass") + print("测试打印日志~") def testCase3(self): - self.assertEqual(5, 5, "testError") + self.assertEqual(5, 5, "testCase_Pass") def testCase4(self): - self.assertEqual(2, 1, "测试错误") + self.assertEqual(2, 1, "测试用例_不通过") def testCase5(self): - self.assertEqual(2, 9, "testError") + self.assertEqual(2, 9, "测试用例_不通过") def testCase6(self): pass @@ -66,6 +71,7 @@ def Suite(): suiteTest.addTest(MyTestCase("testCase3")) suiteTest.addTest(MyTestCase("testCase4")) suiteTest.addTest(MyTestCase("testCase5")) + suiteTest.addTest(MyTestCase("testCase6")) suiteTest.addTest(APITestCase("testCase1")) suiteTest.addTest(APITestCase("testCase2")) suiteTest.addTest(APITestCase("testCase3")) @@ -74,22 +80,13 @@ def Suite(): suiteTest.addTest(APITestCase("testCase6")) return suiteTest -''' -问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 -其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执行测试用例,这种情况下,执行的只是用例或者套件,而不是整个文件,写在main里的代码是不会被执行的!!自然无法生成测试报告 -我们在如果想要生成测试报告,那么一定要注意右键执行时选择的右键菜单,一定要当做文件执行,不要让编辑器当做用例执行 -if __name__ == ‘__main__‘: -if __name__ == ‘python‘: -# 把main修改成自己的文件夹名就可以了 ----试了不行 -''' if __name__ == '__main__': #确定生成报告的路径 - filePath ='F:\\HTMLTestReportCN.html' + filePath ='/Users/albert/PycharmProjects/HTMLTestRunnerCN/ReportCN.html' fp = open(filePath,'wb') #生成报告的Title,描述 - runner = HTMLTestReportCN.HTMLTestRunner( + runner = HTMLTestRunnerCN.HTMLTestReportCN( stream=fp, title='自动化测试报告', #description='详细测试用例结果', diff --git a/python3x/test_HTMLTestReportEN.py b/test_HTMLTestRunnerEN.py similarity index 58% rename from python3x/test_HTMLTestReportEN.py rename to test_HTMLTestRunnerEN.py index 50f8873..23a05b8 100644 --- a/python3x/test_HTMLTestReportEN.py +++ b/test_HTMLTestRunnerEN.py @@ -1,7 +1,7 @@ # -*- coding:utf-8 -*- import unittest -import HTMLTestReportEN +import HTMLTestRunnerEN @@ -16,17 +16,18 @@ def tearDown(self): def testCase1(self): - self.assertEqual(2,2,"testError") - + self.assertEqual(2,2,"testCase_Pass") def testCase2(self): - self.assertEqual(2,3,"testError") + self.assertEqual(2,3,"testCase_Fail") def testCase3(self): self.assertEqual(2,5,"测试错误") + test_error def testCase4(self): - self.assertEqual(2,1,"测试错误") + self.assertEqual(2,2,"测试错误") + findyou def testCase5(self): pass @@ -39,19 +40,22 @@ def tearDown(self): pass def testCase1(self): - self.assertEqual(2, 2, "testError") + self.assertEqual(2, 2, "testCase_Pass") + print("测试打印日志~") def testCase2(self): - self.assertEqual(3, 3, "testError") + self.assertEqual(3, 3, "testCase_Pass") + print("测试打印日志~") def testCase3(self): - self.assertEqual(5, 5, "testError") + self.assertEqual(5, 5, "testCase_Pass") def testCase4(self): - self.assertEqual(2, 1, "测试错误") + self.assertEqual(2, 1, "testCase_Error") + findyou def testCase5(self): - self.assertEqual(2, 6, "testError") + self.assertEqual(2, 6, "testCase_Fail") def testCase6(self): pass @@ -74,22 +78,13 @@ def Suite(): suiteTest.addTest(APITestCase("testCase6")) return suiteTest -''' -问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 -其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执行测试用例,这种情况下,执行的只是用例或者套件,而不是整个文件,写在main里的代码是不会被执行的!!自然无法生成测试报告 -我们在如果想要生成测试报告,那么一定要注意右键执行时选择的右键菜单,一定要当做文件执行,不要让编辑器当做用例执行 -if __name__ == ‘__main__‘: -if __name__ == ‘python‘: -# 把main修改成自己的文件夹名就可以了 - ----试了不行 -''' if __name__ == '__main__': #确定生成报告的路径 - filePath ='F:\\HTMLTestReportEN.html' + filePath = '/Users/albert/PycharmProjects/HTMLTestRunnerCN/ReportCN.html' + # filePath = 'F:\\ReportEN.html' fp = open(filePath,'wb') #生成报告的Title,描述 - runner = HTMLTestReportEN.HTMLTestRunner( + runner = HTMLTestRunnerEN.HTMLTestReportEN( stream=fp, title='{ Test Report }', #description='详细测试用例结果',