起因:

在运行下面的unittest过程中出现了个Traceback:

被测试脚本:

# splitter.py
def split(line, types=None, delimiter=None):
"""Splits a line of test and optionally performs type conversion.
For example: >>> split('GOOD 100 490.50')
['GOOD', '100', '490.50']
>>> split('GOOD 100 490.50', [str, int, float])
['GOOD', 100, 490.50]
>>>
By default, splitting is perfomed on whitespace, but a different delimiter
can be selected with the delimiter keyword argument: >>> split('GOOD, 100, 490.50', delimiter=',')
['GOOOD', '100', '490.50']
>>>
""" fields = line.split(delimiter)
if types:
fields = [ty(val) for ty, val in zip(types, fields)]
return fields if __name__ == '__main__':
# test myself
import doctest
doctest.testmod()

测试脚本:

# testsplitter.py
import splitter
import unittest # unit test
class TestSplitFunction(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def testsimplestring(self):
r = splitter.split('GOOD 100 490.50')
self.assertEqual(r, ['GOOD', '100', '490.50'])
def testypeconvert(self):
r = splitter.split('GOOD 100 490.50', [str, int, float])
self.assertAlmostEqual(r, ['GOOD', 100, 490.50])
def testdelimiter(self):
r = splitter.split('GOOD,100,490.50', delimiter=',')
self.assertEqual(r, ['GOOD', '100', '490.50']) # Run unit test
if __name__ == '__main__':
unittest.main()

结果:

...
----------------------------------------------------------------------
Ran 3 tests in 0.011s OK
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Python Scripts\testsplitter - 副本.py", line 23, in <module>
unittest.main()
File "D:\Python33\lib\unittest\main.py", line 125, in __init__
self.runTests()
File "D:\Python33\lib\unittest\main.py", line 267, in runTests
sys.exit(not self.result.wasSuccessful())
SystemExit: False
>>> ================================ RESTART ================================
>>>
...
----------------------------------------------------------------------
Ran 3 tests in 0.011s OK
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Python Scripts\testsplitter - 副本.py", line 23, in <module>
unittest.main()
File "D:\Python33\lib\unittest\main.py", line 125, in __init__
self.runTests()
File "D:\Python33\lib\unittest\main.py", line 267, in runTests
sys.exit(not self.result.wasSuccessful())
SystemExit: False

从结果看,所有测试用例是都通过的,但是出现了Traceback,SystemExit: False.

分析:

查找到的链接: http://bugs.python.org/issue2821

这是一个IDLE问题

IDLE catches the SystemExit function raised by TestProgram().runTests()
and prints the traceback. Not a bug in unittest.

因为unittest.main()函数会调用sys.exit()来结束函数进程。使用的参数就是not self.result.wasSuccessful()

进一步分析:

那如果是assert过程中出现fail,会是什么样?

修改测试脚本:

# testsplitter.py
import splitter
import unittest # unit test
class TestSplitFunction(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def testsimplestring(self):
r = splitter.split('GOOD 100 490.50')
self.assertEqual(r, ['GOOD', '100', '490.50'])
def testypeconvert(self):
r = splitter.split('GOOD 100 490.50', [str, int, float])
self.assertAlmostEqual(r, ['GOOD', 10, 490.50]) # Modify this line
def testdelimiter(self):
r = splitter.split('GOOD,100,490.50', delimiter=',')
self.assertEqual(r, ['GOOD', '100', '490.50']) # Run unit test
if __name__ == '__main__':
unittest.main()

运行结果:

..E
======================================================================
ERROR: testypeconvert (__main__.TestSplitFunction)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Python Scripts\testsplitter - 副本.py", line 16, in testypeconvert
self.assertAlmostEqual(r, ['GOOD', 10, 490.50])
File "D:\Python33\lib\unittest\case.py", line 683, in assertAlmostEqual
if round(abs(second-first), places) == 0:
TypeError: unsupported operand type(s) for -: 'list' and 'list' ----------------------------------------------------------------------
Ran 3 tests in 0.077s FAILED (errors=1)
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\Python Scripts\testsplitter - 副本.py", line 23, in <module>
unittest.main()
File "D:\Python33\lib\unittest\main.py", line 125, in __init__
self.runTests()
File "D:\Python33\lib\unittest\main.py", line 267, in runTests
sys.exit(not self.result.wasSuccessful())
SystemExit: True

分析:

unittest里面的assert和一般的assert是不一样的,即使fail了,其实还是会继续执行其他的测试用例,不会立即跳出函数。最后跳出函数还是调用sys.exit(),只不过这个时候的参数就是True了。

类似sys.exit(1) - 表示非正常退出。在unittest里面表示有测试用例失败。

sys.exist(0) - 正常退出。在unittest里面表示测试用例均通过。

unittest使用过程中sys.exit(not self.result.wasSuccessful())的更多相关文章

  1. python中sys.exit()和os._exit(0)退出程序

    python中退出程序的两种方法,0为默认状态,可以为空,两者均会退出当前运行的程序,os._exit(0)中的0不能省略 sys.exit(0):可以捕获SystemExit异常,然后做相应的清理工 ...

  2. Python中 os._exit() sys.exit() exit()区别

    Python退出程序的方式有两种:os._exit(), sys.exit() 1)os._exit() 直接退出 Python程序,其后的代码也不会继续执行. 2)sys.exit() 引发一个 S ...

  3. python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    os._exit() 和 sys.exit() os._exit() vs sys.exit() 概述 Python的程序有两中退出方式:os._exit(), sys.exit().本文介绍这两种方 ...

  4. 使用beanstalkd实现定制化持续集成过程中pipeline

    持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...

  5. ltib安装过程中遇到好多问题,从网上转来的好多份总结

    最近调试MPC5125的板子,第一步LTIB都装不过去,挫败感十足. LTIB的安装镜像来自于freescale的ltib-mpc5121ads-200906,是用于Ubuntu 10版本之前的,现在 ...

  6. Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()

    sys模块:负责程序和Python交互. sys常用方法:===========================  sys.stdout.write('please:')val = sys.stdin ...

  7. lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  8. Python os._exit() sys.exit()

    os._exit()会直接将python程序终止,之后的所有代码都不会继续执行. sys.exit()会引发一个异常:SystemExit,如果这个异常没有被捕获,那么python解释器将会退出.如果 ...

  9. Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统

    前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...

随机推荐

  1. hibernate.xml文件详解

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  2. cocos2d之z轴位置示例

    1:设置资源本地z轴位置 2:调整位置示例 3:调整两个资源为同一父节点 4:ImageView 设置资源,此赋值方法第一个为资源路径

  3. groups, usermod, chown, chgrp, chmod

    Linux文件权限简介 Linux的每个文件可以由三种用户访问 属主权限:创建人的权限 属组权限:与创建同一个用户组的权限 其他权限:和创建人不在同一个用户组的用户的权限 当然,root用户拥有最高权 ...

  4. linux基础-基本命令的讲解(1-7单元)

    基本命令的讲解 主要内容介绍 1.LINUX操作系统安装及初始化配置(熟悉):2.LINUX操作系统目录组成结构及文件级增删改查操作(重点):3.LINUX操作系统用户.权限管理(重点):4.开源软件 ...

  5. System V IPC(2)-信号量

    一.概述                                                    System V信号量与System V消息队列不同.它不是用来在进程间传递数据.它主要 ...

  6. stm32 USART rs485 rs232

    转载自:http://www.cnblogs.com/chineseboy/archive/2013/03/06/2947173.html 前题: 前段时间,在公司调试了一个项目,很简单,但对于初学的 ...

  7. Tomcat免安装配置

    大家都知道tomcat吧!因为Tomcat 技术先进.性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器,也是运行Servlet和JS ...

  8. label的for属性

    一.使用介绍 <label>专为input元素服务,为其定义标记. for属性规定label与哪个表单元素绑定 label和表单控件绑定方式又两种: 1.将表单控件作为label的内容,这 ...

  9. 周五了啦啦啦啦-LAMP+PHP‘s OOP

    hi 周五咯~~ 1.LAMP配置完结篇 五.LAMP配置环境优化 5.4 虚拟主机工作原理 apache的虚拟主机.virtual-host 用不同的域名访问不同的目录——手动模拟dns 修改hos ...

  10. C#基础---IComparable用法,实现List<T>.sort()排序

    List<T>.sort()可以实现对T的排序,比如List<int>.sort()执行后集合会按照int从小到大排序.如果T是一个自定义的Object,可是我们想按照自己的方 ...