概述
在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况。
原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 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
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 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中单元测试出错了,会怎么样?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复