• python使用 HTMLTestRunner.py生成测试报告


    HTMLTestRunner.py python 2版本

    下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

    使用时,先建立一个”PyDev Package“,将下载下来的HTMLTestRunner.py文件拷贝在该目录下。

    例子:testcase5_dynamic.py

    复制代码
    import unittest
    from dev.widget import Widget
    
    class WidgetTestCase(unittest.TestCase):
        def setUp(self):
            self.widget=Widget()
            
        def tearDown(self):
            self.widget.dispose()
            self.widget=None
            
        def testSize(self):
            self.assertEqual(self.widget.getSize(), (40,40), "Wrong")
            
        def testResize(self):
            self.widget.resize(100, 100)
            self.assertEqual(self.widget.getSize(), (100,100), "Wrong")
    复制代码

    html_report.py:

    复制代码
    #coding:utf-8
    
    from lib import HTMLTestRunner
    import unittest
    from testcase5_dynamic import WidgetTestCase
    
    if __name__=='__main__':
        suite=unittest.makeSuite(WidgetTestCase)
        filename='D:\myreport.html'
        fp=file(filename,'wb')
        runner=HTMLTestRunner.HTMLTestRunner(fp,title=u'my unit test',description=u'This is a report test')
        runner.run(suite)
    复制代码

    Run的时候,需要使用Python Run,使用Python unit-test跑测试生成不了myreport.html,目前还不知道为什么。

    有时候,不会立即生成D:\myreport.html,我们可以自己先建立一个空的myreport.html,这样再运行之后打开就会看到报告内容。

    HTMLTestRunner.py 的python3 版本

    由于 HTMLTestRunner.py 原本就是python2版本,目前还没找到python3版本,所以需要我们自己修改 HTMLTestRunner.py 文件。

    1. 修改的地方

    问题一:No module named StringIO

    原因:python 3 中 没有 StringIO 这个模块。这里我们需要使用io 这个模块来代替。

    解决方法:

    第94行引入的名称要改,从 import StringIO 改成import io。

    相应的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()


    问题二:AttributeError: 'dict' object has no attribute 'has_key'

    原因:python 3 字典类型的object 已经不支持 has_key函数,我们需要使用in 来进行遍历。

    解决方法:

    定位到642行,if not rmap.has_key(cls): 需要换成 if not cls in rmap:


    问题三:'str' object has no attribute 'decode'

    原因:python3 里面对字符的操作中,decode已经拿掉了。

    解决方法:

    定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。

    另外766还有类似的uo = o.decode('latin-1'),改成 uo=o ;


    问题四 :TypeError: can't concat bytes to str

    原因:定位一下,报在了778行的内容escape(uo+ue) 。这是因为我们上面给uo赋值的时候,走的是else流程,uo被赋值的是bytes类型的值。 而bytes类型不能直接转化为str类型。所以我们需要在前面给uo赋值的时候先将bytes类型转换为 str类型。

    解决方法:

    修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。

    另外 774还有类似的  ue = e, 改成 ue = e.decode('utf-8')。

    问题五:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'

    原因: python3  不支持 print >> sys.stderr 这种写法,这里定义输出流的话,采用print("This is print str",file=sys.stderr) 这种方式。

    解决方法:

    定位到631行,把print的语句修改掉,原来是print >>sys.stderr, ' Time Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print(' Time Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)

    问题六:TypeError: 'str' does not support the buffer interface

    原因:定位一下,问题出在118行,这里s是str类型,我们需要把传过来的s转化为bytes类型。

    解决方法:

    定位到118行,把 self.fp.write(s) 修改为 self.fp.write(bytes(s,'UTF-8')) 即可。

    2. 保存

    修改后对HTMLTestRunner.py 保存一下。

    3. 调用语句更改

    python3 里面打开文件使用 open,不要再去用file了。

    即 fp = file(filename,'wb')替换成 fp = open(filename,'wb');

    关闭该文件可用fp.close()

    备注: 改动之后,中文也不会乱码。

    HTMLTestRunner.py 的使用备注

    1. 问题: 执行测试用例的过程中,不会打印任何东西,导致上个厕所或第二天回来时,根本不知道执行到哪了,或者执行多少测试用例了。

    解决思路: 每次执行一个测试用例时,就打印该测试用例的名称。

    解决方案: 调用HTMLTestRunner时,定义 verbosity 为大于1的整数,比如说 2:

    runner=HTMLTestRunner.HTMLTestRunner(fp,title="xxxx",description="xxx",verbosity=2)

    在控制台console 就可以看到每执行一条用例,就会有如下输出:

    E  test (testcases.login.testcase1.MyTest)
    ok  test (testcases.login.testcase2.MyTest)
    F  test (testcases.login.testcase3.MyTest)

    2. HTMLTestRunner 脚本阅读。

    复制代码
    class OutputRedirector(object)
    # 将输出进行重定向
    
    class Template_mixin(object)
    # 定义生成HTML结果文件所需要的模板。
    # 如果我们想改变HTML的格式等待,可以在这里进行改动
    
    class _TestResult(TestResult)
    # 定义继承自 unittest.TestResult 的 类。
    # 这里重写了 unittest.TestResult 的多个方法,比如 startTest(self, test) 等等
    
    class HTMLTestRunner(Template_mixin)
    # 这里可以说是使用 HTMLTestRunner.py 的入口。定义了多个我们可以看到的方法,比如 run(self, test)
    
    class TestProgram(unittest.TestProgram)
    # 这里继承自 unittest.TestProgram 类,重写了 runTests 方法。
    # 用于命令行执行测试
    复制代码

    3. 缺点:使用HTMLTestRunner的执行测试用例的过程中,如果中间中断执行,则已经执行完的用例结果也不会打印到html文件。

    目前我这边是自己编写脚本生成html来代替使用 HTMLTestRunner ,感觉 HTMLTestRunner 应该没有每执行一条用例就讲结果写入到html结果文件的方法。

    测试案例:
    1.登录百度云
    2.进入“立即注册百度账号”网页
    3.进入”会员中心”网页
    4.生成测试报告的文件名为:2015-01-02result.html。

    测试脚本:

    #coding=utf-8      #防止中文乱码
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    #加载键盘使用的模块
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import Select
    from selenium.common.exceptions import NoSuchElementException
    
    #加载unittest模块
    import unittest 
    import time
    import re
    #加载HTMLTestRunner,用于生成HTMLreuslt
    import HTMLTestRunner
    
    class BaiduYun(unittest.TestCase):
        def setUp(self):
            self.browser=webdriver.Chrome()
            self.browser.implicitly_wait(30)
            self.base_url="http://yun.baidu.com"
            self.verficationErrors=[]
            self.accept_next_alert=True
        def Login(self):
            browser=self.browser
            browser.get(self.base_url+'/')
            u"""百度云登录"""
            browser.find_element_by_name("userName").clear()           
            username=browser.find_element_by_name("userName")              
            username.send_keys("alu***")
            username.send_keys(Keys.TAB)
            time.sleep(2)
            password=browser.find_element_by_name("password")
            password.send_keys("***")
            password.send_keys(Keys.ENTER)
            time.sleep(3)
            browser.close()
        def Register(self):
            browser=self.browser
            browser.get(self.base_url+'/')
            u"""立即注册百度账号"""
            browser.find_element_by_class_name("link-create").click()
            time.sleep(2)
            browser.close()
        def Link(self):
            browser=self.browser
            browser.get(self.base_url+'/')
            u"""会员中心"""
            browser.find_element_by_link_text("会员中心").click()
            time.sleep(2)
            browser.close()
        def tearDown(self):
            self.browser.quit()
            self.assertEqual([],self.verficationErrors) 
    if __name__=="__main__":
        #unittest.main()
        testunit=unittest.TestSuite()
        #将测试用例加入到测试容器中
        testunit.addTest(BaiduYun("Login"))
        testunit.addTest(BaiduYun("Register"))
        testunit.addTest(BaiduYun("Link"))
        #获取当前时间,这样便于下面的使用。
        now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time())) 
        #打开一个文件,将result写入此file中
        fp=open("result"+now+".html",'wb')
        runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='test result',description=u'result:')
        runner.run(testunit) 
        fp.close()
    F5,运行,就这样得到了test result
  • 相关阅读:
    字典
    字符串常用的方法
    切片,集合、文件处理
    蓝桥杯练习 Day6 题解
    spoj-ORDERS
    spoj-SUBSUMS
    spoj
    spoj --- ABCDEF
    C. Andryusha and Colored Balloons
    B. The Meeting Place Cannot Be Changed
  • 原文地址:https://www.cnblogs.com/camilla/p/7243044.html
Copyright © 2020-2023  润新知