起因:

在运行下面的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. winform 可拖动的自定义Label控件

    效果预览: 实现步骤如下: (1)首先在项目上右击选择:添加->新建项,添加自定义控件 (2)自定义的一个Label让它继承LabelControl控件,LabelControl控件是DevEx ...

  2. Python标准库01 正则表达式(re包)

    python正则表达式基础 简单介绍 正则表达式并不是python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...

  3. javascript刷新父页面的内容

    适应于超级链接和弹出窗口 function RefreshParent() {     if (window.opener != null) {                             ...

  4. COM中的线程模式

      Choosing the threading model for an object depends on the object's function. An object that does e ...

  5. Spring学习之第一个hello world程序

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

  6. 探索 OpenStack 之(16):计量模块 Ceilometer 介绍及优化

    0. 背景 0.1 为什么要有 Ceilometer? 通常云,特别是公有云在计费方面有三个层次: 计量 (Metering): 收集资源的使用数据,其数据信息主要包括:使用对象(what), 使用者 ...

  7. Stanford机器学习笔记-6. 学习模型的评估和选择

    6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...

  8. 第二章《深入C#数据类型》项目经理评分

    一:创建MyOffices项目,创建UserInfo类,用来存储员工 工号,姓名,年龄,评价,年度得分 二:创建查看评分窗体(frmShow),添加定义员工数组,将员工数据绑定到frmShow窗体的L ...

  9. Maven系列三Maven内置变量

    Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...

  10. C与CPP 在线手册查找

    1. MSDN 的标准与使用 https://msdn.microsoft.com/zh-cn/library/3bstk3k5.aspx 2. Cpp在线查看. http://www.cpluspl ...