老李分享:开发python的unittest结果输出样式

 

Python的unittest结果命令行输出,格式比较乱。为了提高格式输出的可读性,实现可以不同的颜色标识。所以准备扩展Python的unittest模块。

首先,unittest默认命令行输出结果如下。(两个测试案例,一个通过,一个不通过)。

import unitest

class FooTest(unittest.TestCase):

def setUp(self):

self.a = 1

def testPass(self):

self.a = self.a + 1

self.assertEqual(2, self.a)

def testFail(self):

self.a = self.a + 1

self.assertEqual(3, self.a)

main函数,调用unittest自己的TextTestRunner:

if __name__=='__main__':

unittest.main()

输出的结果:

下面实现一个自定义的TestRunner,输出可以有不同的颜色。

1. 编写自定义的TestRunner类,执行其中的run方法,控制整个测试的过程和输出。参照unitest自己的TextTestRunner方法就好了。只是把输出部分做一些修改。
2. 编写自定义的TestResult类,继承自unittest中的TestResult类。重写其中几个方法,也都是修改输出内容的部分。

当然,我们还需要在命令行中输出不同的颜色。
如果你不是使用的Windows,可以参照:http://code.activestate.com/recipes/475116-using-terminfo-for-portable-color-output-cursor-co/ 
如果你使用的是Windows,其实只要调用一个Windows API就好了。这个API就是SetConsoleTextAttribute。见下面的代码:

## {{{ http://code.activestate.com/recipes/496901/ (r3)

# See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_api_reference.asp

# for information on Windows APIs.

STD_INPUT_HANDLE = -10

STD_OUTPUT_HANDLE= -11

STD_ERROR_HANDLE = -12

FOREGROUND_WHITE = 0x0007

FOREGROUND_BLUE = 0x01 # text color contains blue.

FOREGROUND_GREEN= 0x02 # text color contains green.

FOREGROUND_RED  = 0x04 # text color contains red.

FOREGROUND_INTENSITY = 0x08 # text color is intensified.

FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN

BACKGROUND_BLUE = 0x10 # background color contains blue.

BACKGROUND_GREEN= 0x20 # background color contains green.

BACKGROUND_RED  = 0x40 # background color contains red.

BACKGROUND_INTENSITY = 0x80 # background color is intensified.

import ctypes

std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

def set_color(color, handle=std_out_handle):

"""(color) -> BOOL

Example: set_color(FOREGROUND_GREEN | FOREGROUND_INTENSITY)

"""

bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)

return bool

TestRunner类

class MyTestRunner:

def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):

self.stream = _ColorWritelnDecorator(stream)

self.descriptions = descriptions

self.verbosity = verbosity

def run(self, test):

result = MyTestResult(self.stream, self.descriptions, self.verbosity)

self.stream.yellow('Note: Your Unit Tests Starts')

self.stream.writeln()

startTime = time.time()

test(result)

stopTime = time.time()

timeTaken = stopTime - startTime

self.stream.green(result.separator2)

run = result.testsRun

self.stream.writeln("Ran %d test%s in %.3fs" %

(run, run != 1 and "s" or "", timeTaken))

failed, errored = map(len, (result.failures, result.errors))

self.stream.green("[  PASSED  ] %d tests" % (run - failed - errored))

self.stream.writeln()

if not result.wasSuccessful():

errorsummary = ""

if failed:

self.stream.red("[  FAILED  ] %d tests, listed below:" % failed)

self.stream.writeln()

for failedtest, failederorr in result.failures:

self.stream.red("[  FAILED  ] %s" % failedtest)

self.stream.writeln()

if errored:

self.stream.red("[  ERRORED ] %d tests" % errored)

for erroredtest, erorrmsg in result.errors:

self.stream.red("[  ERRORED ] %s" % erroredtest)

self.stream.writeln()

self.stream.writeln()

if failed:

self.stream.write("%d ERRORED TEST" % failed)

if errored:

self.stream.write("%d ERRORED TEST" % errored)

return result

TestResult类

class MyTestResult(unittest.TestResult):

separator1 = '[----------] '

separator2 = '[==========] '

def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):

unittest.TestResult.__init__(self)

self.stream = stream

self.showAll = verbosity > 1

self.dots = verbosity == 1

self.descriptions = descriptions

def getDescription(self, test):

if self.descriptions:

return test.shortDescription() or str(test)

else:

return str(test)

def startTest(self, test):

self.stream.green('[ Run      ] ')

self.stream.writeln(self.getDescription(test))

unittest.TestResult.startTest(self, test)

if self.showAll:

self.stream.write(self.getDescription(test))

self.stream.write(" ... ")

def addSuccess(self, test):

unittest.TestResult.addSuccess(self, test)

if self.showAll:

self.stream.writeln("ok")

elif self.dots:

self.stream.green('[       OK ] ')

self.stream.writeln(self.getDescription(test))

def addError(self, test, err):

unittest.TestResult.addError(self, test, err)

if self.showAll:

self.stream.writeln("ERROR")

elif self.dots:

self.stream.write('E')

def addFailure(self, test, err):

unittest.TestResult.addFailure(self, test, err)

if self.showAll:

self.stream.writeln("FAIL")

elif self.dots:

self.stream.red('[  FAILED  ] ')

self.stream.writeln(self.getDescription(test))

self.stream.write(self._exc_info_to_string(err, test))

执行

if __name__=='__main__':
    unittest.main(testRunner=MyTestRunner())

效果

老李分享:开发python的unittest结果输出样式的更多相关文章

  1. 老李分享:Python开发性能测试脚本

    老李分享:Python开发性能测试脚本   测试开发工程师的工作主要是根据测试目标来完成,帮助测试人员完成测试目标,测试的业务需求是测试人员提出,但是由于环境的制约,手中没有性能测试工具的时候,性能测 ...

  2. 老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具

    老李分享:使用 Python 的 Socket 模块开发 UDP 扫描工具 poptest是业内唯一的测试开发工程师培训机构,测试开发工程师主要是为测试服务开发测试工具,在工作中要求你做网络级别的安全 ...

  3. 老李分享:走读unittest源码

    老李分享:走读unittest源码   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开发工程师就业培训感兴趣 ...

  4. 老李分享:Uber究竟是用什么开发语言? 1

    老李分享:Uber究竟是用什么开发语言?   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...

  5. 老李分享:loadrunner的java user脚本开发

    老李分享:loadrunner的java user脚本开发 poptest在性能测试loadrunner的课程里,以web协议为主,同时也讲解其他协议的脚本开发,对于一个性能测试工程师需要掌握一个以上 ...

  6. 老李分享:Eclipse中开发性能测试loadrunner脚本

    老李分享:Eclipse中开发性能测试loadrunner脚本 前篇我分享了如何用loadrunner搭建javauser的性能测试脚本环境,本次我来告诉大家如何在eclipse开发loadrunne ...

  7. 老李分享:pep8 python代码规范

    老李分享:pep8 python代码规范 什么是PEPPEP是 Python Enhancement Proposal 的缩写,翻译过来就是 Python增强建议书 . PEP8 译者:本文基于 20 ...

  8. CMD 下运行python的unittest测试脚本无输出

    正常情况下windows的命令行执行python脚本命令: python 脚本名.py 我这样做了,看截图可以看到,并没有期待中那样有一堆高大上的信息输出,反而毛都没有!!!! 于是,我想起了度娘,但 ...

  9. Python+selenium+unittest+HTMLTestReportCN单元测试框架分享

    分享一个比较基础的,系统性的知识点.Python+selenium+unittest+HTMLTestReportCN单元测试框架分享 Unittest简介 unittest是Python语言的单元测 ...

随机推荐

  1. 不惧面试:HTTP协议(3) - Cookie

    v博客前言 先交代下背景,写这个系列的原因是总结自己遇到的面试题以及可能遇到的题目,更重要的是,今年定的目标是掌握网络这一块的知识点,先是搞懂HTTP协议,然后是TCP/IP协议,再就是WCF如何运用 ...

  2. java学习笔记——Java多客户端与服务器通信

    先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...

  3. .Net Standard扩展支持实例分享

    上篇(.Net基础体系和跨框架开发普及)介绍了.Net当前生态下的大概情况,也分享了简单实现的过程,这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程,主要集中在: ...

  4. Windows Form线程同步

    .Net多线程开发中,经常需要启动工作线程Worker thread处理某些事情,而工作线程中又需要更新主线程UI thread的界面状态.我们只能在主线程中操作界面控件,否则.Net会抛出异常. 那 ...

  5. How do I get the lowest value of all the non zero value pixels?

    How do I get the lowest value of all the non zero value pixels? 问题就是题目:如何从图像中获得非零的最小值. 优质解答: You can ...

  6. JNI调用的helloworld(JNI_OnLoad映射方式)

    本示例展示JNI的基本示例,helloworld级别的,不过是用JNI_OnLoad映射的方式. 直接看代码,先看包含native method的Person.java的代码: package hel ...

  7. DbUtils类基本使用

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  8. 2017-2-22 if语句 if语句的嵌套 以及课堂练习 经典猜拳游戏,闰年判断,输出当前时间的天数等

    (一)if语句 1.格式   if(){ }else if() { } 注意:如果if后面不写花括号,只执行下面第一句 (二)语句1:顺序语句 2:循环语句 3:分支语句 课后练习: 1.猜拳游戏(用 ...

  9. Python拉勾爬虫——以深圳地区数据分析师为例

    拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬.不过只要清楚它的原理,依然比较好爬.其机制主要就是AJAX异步加载JSON数据,所以至少在搜索页面里翻页url不会变化,而且数 ...

  10. 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输

    一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...