Python中单元测试出错了,会怎么样?

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

原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中
原文地址:https://www.cnblogs.com/tizer/p/11087012.html