zoukankan      html  css  js  c++  java
  • 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中
  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/tizer/p/11087012.html
Copyright © 2011-2022 走看看