关于HTMLTestRunner的中断与实时性问题

HTMLTestRunner是python unittest的一种生成HTML报告的方法

包含:

1. Title及描述信息

2. 按照unittest的case层级显示,并可折叠日志

3. 时间及统计信息

 

 

具体使用方法网上一抓一大把,不罗嗦了

 

这些作为TestReport,其实只是保留了一些基本的信息,在很多时候无法满足需求。

而自动化的开发者也不必要过分追求这种生成报告的方式。

 

HTMLTestRunner的适用性:

1. case独立,用例库相对稳定(当然也可以自行开发用例库灵活管理的方法)

2. 执行时间较短,且不中断的测试

3. 只关注用例的执行结果,保留文本日志,不保留大量数据

 

有些时候对HTMLTestRunner二次开发的工作量已经大于自行开发日志、报告模块时,便不宜适用:

1. 除脚本的执行结果外,还需记录其他数据,如性能测试,需要输出格式化统计报告,如Excel,或GUI测试需要截图,或测试设备需要多线程记录日志(debug信息等),等等

2. 有可能经常中途中断的测试,如测试用例对环境要求高,测试系统、尤其是设备会出现crash等问题block测试,需要中断,按照网上一般教程的使用方法,测试正常结束前终端,报告是空白的

3. 长时间的测试,HTMLTestRunner最大的一个问题在于实时性太差,unittest suite执行完之后,报告才会生成

 

那么,针对这3中情况:

1. 扩展HTMLTestRunner,或使其作为辅助报告

    HTMLTestRunner本身的HTML code很简单,可以自行编辑HTML元素进行修改,比如在Pass/Fail/Error之外增加一列Skip统计,

    或者增加更高级的功能,增加插入绘制表格、插入图片等

    在code中也可以看到注释如下:

    """
    Define a HTML template for report customerization and generation.

    Overall structure of an HTML report

    HTML
    +------------------------+
    |<html>                  |
    |  <head>                |
    |                        |
    |   STYLESHEET           |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |  </head>               |
    |                        |
    |  <body>                |
    |                        |
    |   HEADING              |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |   REPORT               |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |   ENDING               |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |  </body>               |
    |</html>                 |
    +------------------------+
    """

    另一种方案,将HTML作为Summary报告,将测试的具体数据生成更为合适的格式。

 

2. 引入KeyBoardInterrupt异常,后用 unittest.TestSuite.__call__ 调用

TestCase对象具有__call__属性,定义如下,直接调用对象(),将执行run()。

def __call__(self, *args, **kwds):
    return self.run(*args, **kwds)

这样可以run时可以获取用户输入的Ctrl C,异常退出后,最后一个case Error,包括之前已经执行过的用例,一起生成HTML报告

 

3. HTMLTestRunner的实时性问题暂时没有想到好的解决方法

它的实时性差,表现在:

    a. 每个用例结束之后,无法立刻刷新HTML,只能在测试suite结束、或中断后一次性写入

    b. 当然,在用例执行期间,自然也无法查看阶段性日志了

HTMLTestRunner的日志生成时,在unittest的run之后。之前试图解决问题a,修改HTMLTestRunner和unittest code,在每个case结束之后刷新一次报告

不过能力不足,以失败告终了.....

 

最后分析需求,认为:

    a. 解决存储测试数据的问题优先级较高

    b. 测试时间很长

    c. 人工中断情况多

    d. 需要在测试执行期间观察日志,判断系统状态

 

所以放弃了使用HTMLTestRunner,自行封装日志/报告模块.....

如果有能够解决实时性问题的方法,请不吝赐教~谢谢!

posted @ 2017-03-01 23:11  InkDie  阅读(1040)  评论(1编辑  收藏  举报