Python中单元测试出错了,会怎么样?
在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况。
原say_hello_name.py
def hello_name(name):
greet = "Hello , "
return greet + name.title()
修改后say_hello_name.py
def hello_name(first_name,last_name):
greet = "Hello , "
return greet + first_name.title() + ' ' + last_name.title()
修改后的问候语句,不止包含名字,还包含姓,然后我们运行测试类HelloTest,看下效果:
test_say_hello.py
#coding=gbk
import unittest from say_hello_function import hello_name class HelloTest(unittest.TestCase):
"""用于测试say_hello_function.py"""
def test_hello_name(self):
"""是否能正确处理Joker 这个名字"""
hello_str = hello_name('Joker')
self.assertEqual(hello_str,'Hello , Joker') unittest.main()
运行后如下:

解释:我们发现控制台报错了,且包含很多信息,因为测试 未通过时,Python得让你尽可能多的知道为什么错,第一行字母E,表示测试用例中有一个单元测试导致错误。
第二行 ERROR: test_hello_name (__main__.HelloTest) 可以看出是HelloTest 中的test_hello_name 方法导致了错误。而在图中Traceback 更明确的指出了错误的位置,hello_name()缺少了一个必须的位置实参 来对应形参 last_name。倒数第2行,表示运行了一个单元测试。最后还看到了一条消息FAILED它表示整个测试用例都未通过,因为在运行测试用例的时候发生了一个错误。
这样我们就很清楚的知道了错误的位置,我们既然知道错误的位置接下来如何去做?
优化函数hello_name():让这个函数技能接收两个实参,也能接收一个实参,这样就不会出错了,具体修改如下:
最终版say_hello_name.py
def hello_name(first_name,last_name=""):
greet = "Hello , "
if last_name:
return greet + first_name.title() + ' ' + last_name.title()
else :
return greet + first_name.title()
在这个最终版中,姓是可选的,不管是只有名字还是包含姓和名字都能进行处理,我们添加一个新测试来测试包含姓和名字的新功能,修改测试类如下:
test_say_hello.py
#coding=gbk
import unittest from say_hello_function import hello_name class HelloTest(unittest.TestCase):
"""用于测试say_hello_function.py"""
def test_hello_name(self):
"""是否能正确处理Joker 这个名字"""
hello_str = hello_name('Joker')
self.assertEqual(hello_str,'Hello , Joker') def test_hello_first_last(self):
"""能否正确处理Joker Pan这个姓名"""
hello_str1 = hello_name('joker','pan')
self.assertEqual(hello_str1,'Hello , Joker Pan') unittest.main()
运行后控制台打印如下:

额,运气真好,测试用例都通过了,所以在最终版中,函数hello_name()既可以处理Joker 这样的名字也可以处理Joker Pan 这样的姓名,而且我们无需手动去测试此函数。在此函数中添加新功能时,我们就很容易修复完善此函数,因为只要未通过的测试,我们就知道新代码破坏了函数原来的行为。
附上unittest中常用的断言方法(如果想用这些方法,前提是你导入了unittest模块)
| 方法 | 作用 |
| assertEqual(a,b) | 核实 a == b |
| assertNotEqual(a,b) | 核实 a != b |
| assertTrue(x) | 核实x为True |
| assertFalse(x) | 核实x为False |
| assertIn(item,list) | 核实 item 在list中 |
| assertNotIn(item,list) | 核实 item不在 list中 |
Python中单元测试出错了,会怎么样?的更多相关文章
- python中单元测试/数据库预处理的技巧
假设文件结构: pkg/ __init__.py components/ core.py __init__.py tests/ core_test.py __init__.py python -m 你 ...
- python中错误、调试、单元测试、文档测试
错误分为程序的错误和由用户错误的输入引起的错误,此外还有因为各种各样意外的情况导致的错误,比如在磁盘满的时候写入.从网络爬取东西的时候,网络断了.这类错误称为异常 错误处理 普通的错误处理机制就是在出 ...
- 在VS Code中对Python进行单元测试
在VS Code中对Python进行单元测试 Python扩展支持使用Python的内置unittest框架以及pytest和Nose进行单元测试.要使用pytest和Nose,必须将它们安装到当前的 ...
- 在Python中进行自动化单元测试的教程
From: https://www.jb51.net/article/64119.htm 一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必 ...
- eclipse中的出现在打包一次后,后面新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承ActionBarActivity解决方法一样
第一次写博客,有什么问题或者想法的希望各位可以进行评论交流,望大家多多包涵! 遇到的问题是在新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承Actio ...
- EXCEL2007出错了无法使用文档中的ActiveX 控件
EXCEL2007出错了无法使用文档中的ActiveX 控件虽说是很久之前的问题,但是正确的解决方法和原因如下!原因:系统update之后出现的问题解决方法:删除C:\Users\[username] ...
- python—networkx:在一张图中画出多个子图
通过plt.subplot能够在一张图中画出多个子图 #coding: utf-8 #!/usr/bin/env python """ Draw a graph with ...
- python中的单元测试pyUnit
python中的单元测试pyUnit 在Python中进行单元测试时需要用到PyUnit模块,Python 2.1及其以后的版本都将PyUnit作为一个标准模块,但如果你使用的是较老版本的Pyth ...
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
当我们搞定DataSnap后,我们进入客户端程序开发阶段了,我们建立了客户端模块后,打算按照刚才开发服务器的步骤开发客户端程序,随后加入了DBExpress的TSQLDataSet,设定数据库连接后, ...
随机推荐
- STP-5-STP配置及分析
拓扑: root id列出了根的网桥id为两部分,前边是优先级,后边跟着mac地址,cost 0 暗示sw1就是根: 下边的命令确认sw1就是vlan1的根: 下边,sw2配置了一个比sw1更低的优先 ...
- JS 两个数组合并
让我们先考虑下面这情况: 代码如下: var a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];var b = [ "foo", "bar", ...
- Python 数字模块
Python中的数字模块 math模块 random模块 Decimal模块 - 没有损失的小数 Fraction模块 - 可以计算分数
- 最长上升子序列LIS(云笔记图片版)
- PM2常用命令
安装pm2 npm install -g pm2 1.启动 pm2 start app.js pm2 start app.js --name my-api #my-api为PM2进程名称 pm2 ...
- LessCss学习笔记
一.入门 1.LESSCSS是什么? LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编 ...
- 关于Winform控件调用插入点(光标)的用法
我们自定义控件中可能会有一些光标的使用,比如插入文字和图片提示,下面是调用WIN32 API的光标用法 Winform控件调用插入点的用法 // 导入处理光标的 Windows 32 位 API // ...
- datetimepicker 插件位置问题解决经验
使用dadetimepicker进行时间选择是个很不错的选择,但是美中不足的是该插件在chrome中显示弹框的时候有时会出现位置错位的现象,而在IE中则没有这种现象,视图如图1 图1 查阅了网上的资料 ...
- 一步步实现自己的ORM(四)
通过前3章文章,大致对ORM有一定的了解,但也存在效率低下(大量用了反射)和重复代码,今天我们要对ORM进行优化. 具体流程如下: 我们优化的第一个就是减少反射调用,我的思路是定义一个Mapping, ...
- mint 有线网络未管理的解决
sudo gedit /etc/NetworkManager/NetworkManager.conf 修改managed=true 参考链接:http://forum.ubuntu.org.cn/vi ...