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,设定数据库连接后, ...
随机推荐
- idea | gitee 码云
https://blog.csdn.net/qq_32340877/article/details/81205547
- nginx和uwsgi的区别和作用
Django+uwsgi+nginx nginx和uwsgi的区别和作用: 1, nginx是对外的服务器,外部浏览器通过url访问nginx, uwsgi是对内的服务器,主要用来处理动态请求. 2, ...
- flask_之参数传递
参数篇 request接收数据 request对象 method:当前请求方法(POST,GET等) url:当前链接地址 path:当前链接的路径 environ:潜在的WSGI环境 headers ...
- robot framework 在pycharm中语法无法高亮显示的,显示绿色解决办法(Robot Framework with PyCharm)
Robot Framework with PyCharm up vote1down votefavorite 1 I am totally new to automation and trying t ...
- IBatis.net特性展示代码
最近公司计划设计新业务平台架构.数据访问层框架要使用ibatis.net.头让我做些例子给其他同事演示下 ibatis的基本特性.然后评估下看是否使用.本来以后上官方下载NPetshop演示下就行了那 ...
- OutOfMemory
查看图片格式,如果为PNG,可更改为jpg.图片会变小. 停止activity 当activity调用onStop()方法, activity不再可见,并且应该释放那些不再需要的所有资源.一旦acti ...
- Longest Increasing Subsequence的两种算法
问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7-.an,求它的一个子序列(设为s1,s2,-sn),使得这个子序列满足这样的性质,s1<s2<s3<-<sn并且 ...
- MySQL优化汇总
1)mysql优化汇总,转载自网络
- jmeter分布式测试配置
jmeter分布式测试 说明:1台8核16G的windows2008的机器,只能器6000个线程,否则效果不是很好:并且负载机器需要做如下设置: 1.打开注册表:regedit 2.HKEY_LOCA ...
- SQL中的IF ELSE(CASE语句的使用)
大家对IF ELSE语句可能都很熟悉,它是用来对过程进行控制的.在SQL的世界中CASE语句语句有类似的效果.下面简单的介绍CASE语句的用法.考虑下面的情况,假设有个user表,定义如下: CREA ...