在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况。

原say_hello_name.py

1 def hello_name(name):
2     greet = "Hello , "
3     return greet + name.title()

修改后say_hello_name.py

1 def hello_name(first_name,last_name):
2     greet = "Hello , "
3     return greet + first_name.title() + ' ' + last_name.title() 

修改后的问候语句,不止包含名字,还包含姓,然后我们运行测试类HelloTest,看下效果:

test_say_hello.py

#coding=gbk
import unittestfrom say_hello_function import hello_nameclass 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

1 def hello_name(first_name,last_name=""):
2     greet = "Hello , "
3     if last_name:
4         return greet + first_name.title() + ' ' + last_name.title()
5     else :
6         return greet + first_name.title()

在这个最终版中,姓是可选的,不管是只有名字还是包含姓和名字都能进行处理,我们添加一个新测试来测试包含姓和名字的新功能,修改测试类如下:

test_say_hello.py

#coding=gbk
import unittestfrom say_hello_function import hello_nameclass 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中

转载于:https://www.cnblogs.com/tizer/p/11087012.html

Python中单元测试出错了,会怎么样?相关推荐

  1. python中给出一个不超过10的正整数n_求计算机大佬解答python题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 7-4 计算指数 (5 分) 真的没骗你,这道才是简单题 -- 对任意给定的不超过10的正整数n,要求你输出2n.不难吧? 输入格式: 输入在一行中给出一 ...

  2. Python中单元测试和类的测试

    学python中会发现要测试某个函数的功能是否如你预期的一样,用python提供的unittest中的TestCase将会更加的简单,而且更加好用. 单元测试: 单元: def get_formatt ...

  3. python中画出距平垂线_3.机器学习—数据科学包3.3pandas操作

    pandas操作 一.pandas索引 1.Series索引index 2.DateFrame行索引index和列索引columns 3.pandas预置索引的类 4.重复索引 4.1重复索引定义 4 ...

  4. 编译 puppy linux,Puppy Linux import gtk在Python中抛出错误

    我使用的是Linux版本2.6.24.16.我相信它使用的是Puppy linux4.2.我实际上在使用小狗游乐场,这是一个专门的分支.然而,他们的帮助文件暗示它是4.2.在 这个包声称有pygtk, ...

  5. Python中找出dataframe中的重复的行 DataFrame.duplicated()方法

    ● 选择题 以下关于DataFrame.duplicated()函数说法错误的是: A 该函数用于标记dataframe中内容重复的行 B 该函数返回值是一个序列,True表示重复 C 行内容被判定重 ...

  6. [转]Python中找出dataframe中的重复的行 DataFrame.duplicated()方法

    ● 选择题 以下关于DataFrame.duplicated()函数说法错误的是: A 该函数用于标记dataframe中内容重复的行 B 该函数返回值是一个序列,True表示重复 C 行内容被判定重 ...

  7. python中找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

  8. python让函数抛出异常,是否有任何对象可以使str()函数在python中抛出错误或异常?...

    我有一个函数,要求输入是一个字符串. 我知道我可以断言或检查输入类型,但我想尽可能地处理它. 我有以下代码来处理它.但我想知道是否有任何情况,这一行可以抛出我需要处理的异常. def foo(any_ ...

  9. python中构造出一个空的DataFrame,并在循环中不断往dataframe里面添加内容

    这是管培期间的一个学习任务里面其中解决问题用到的方法 关键是下面的result.loc()巧妙地利用len()获取dataframe数据长度 import pandas as pd import nu ...

最新文章

  1. 深度学习(二十四)矩阵分解之基于k-means的特征表达学习
  2. Spark job stage task个数的计算方式
  3. 安装bashee-1-1.2.1.tar.bz2多媒体播放器时的出错问题
  4. 懒人模式Singleton模式Meyers版本号
  5. qpython3第三方库_Python第三方库的安装 --Python3
  6. 定义与声明c语言,c语言定义与声明.ppt
  7. webm格式转换成mp4?
  8. MathType的使用技巧
  9. 亿图图示上线小程序,MindMaster移动端迎来大更新,亿图软件八周年再出发
  10. win10屡次自动打开系统代理服务器的解决办法
  11. Win10自带浏览器MicroEdge无法打开网页---解决办法
  12. MAVEN 引入jar包没问题,但是程序中使用jar中的类报错的坑
  13. 单片机裸机 vs RTOS多线程
  14. Power Apps 应用实战|轻松用 Power Apps 开发员工休假考勤管理小程序
  15. Go语言的errors
  16. MacBookPro你真的会使用吗?
  17. c++/c/java 资源共享群
  18. Linux 的解压缩文件命令
  19. 厦门大学校区计算机考试,厦门大学计算机等级考试报名
  20. x64枚举DPC定时器

热门文章

  1. linux 每周日执行脚本,Linux任务计划和周期性任务执行
  2. 退货表mysql_openant电商-退货 - 数据库设计 - 数据库表结构 - 果创云
  3. firefox+android+平板,Firefox OS首款平板现身,“三头并进”追赶Android
  4. 我教育和科研计算机网是指,我校成为中国教育和科研计算机网湘潭城市节点单位...
  5. pythoncharm下载cpython失败_pycharm虚拟环境下安装mysqlclient失败
  6. 为指定c 语言源程序添加行号,给自己的程序加上行号
  7. oracle的have,Does oracle have “auto number” data type [duplicate]
  8. 数组指针和指针数组的区别(1)
  9. 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card
  10. ZOJ 3747 Attack on Titans