Python学习笔记(6)测试

Chapter 11

测试代码

  • 使用Python标准库中模块unittest提供的测试工具。
#name.py
def get_full_name(first, last, middle=''):
    """获取全名"""
    if middle == '':
        full_name = first.title() + ' ' + last.title()
    else:
        full_name = first.title() + ' ' + middle.title() + ' ' +last.title()
    return full_name
#test.py
import unittest
from name import get_full_name

class NameTestCase(unittest.TestCase):
    """测试name.py"""

    def test_first_last_name(self):
        full_name = get_full_name('ming', 'xing')
        self.assertEqual(full_name, 'Ming Xing')

    def test_first_last_middle_name(self):
        full_name = get_full_name('ming', 'xing', 'xiao')
        self.assertEqual(full_name, 'Ming Xiao Xing')

unittest.main()

注意:
1. NameTestCase是继承unittest.TestCase的。
2. test_first_last_name是一个单元测试,许多单元测试组成测试用例。单元测试的名称,必须test_开头,这样Python才能自动运行它们。另外,单元测试的名称是描述性的,必须高度概括测试内容,方便后续Debug。
3. self.assertEqual(full_name, 'Ming Xing')这是unittest中的一个断言方法,断言方法用来判断结果与我们的预期是否一致。断言方法只能在继承unittest.TestCare中的类中使用。
下面介绍六种常见的断言方法
assertEqual(a, b)核实a == b
assertNotEqual(a, b)核实a != b
assertTrue(x)核实x == True
assertFalse(x)核实x == False
assertIn(Item,List)核实Item in List
assertNotIn(Item,List)核实Item not in List
4. 如果程序正常运行,输出是这样的


..
----------------------------------------------------------------------

Ran 2 tests in 0.000s

注意:

  1. 如果test_first_last_middle_name发生错误,另一个正确,输出是这样的

    
    E.
    ======================================================================
    
    
    ERROR: test_first_last_middle_name (__main__.NameTestCase)
    ----------------------------------------------------------------------
    
    Traceback (most recent call last):
     File "/Users/xxx/Desktop/CODE/test.py", line 10, in test_first_last_middle_name
       full_name = get_full_name('ming', 'xing', 'xiao')
     File "/Users/xxx/Desktop/CODE/name.py", line 6, in get_full_name
       full_name = first.title() + ' ' + middle.title() + ' ' +last.title
    TypeError: must be str, not builtin_function_or_method
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    FAILED (errors=1)
  2. 关于上面两个输出结果:E表示一个单元测试引发错误,F表示一个单元测试导致断言失败,.表示一个单元测试通过。

  3. unittest.main()让Python运行这个文件中的测试。
  • 测试类
    与上面的测试函数类似。只不过,在每一个单元测试中,我们都先要对类实例化,并设置其属性。为了减少工作量,可以在单元测试之前使用setUP(),这样,我们只需创建一次实例,就可以在每个测试方法中使用它们。
#此处省略AnonymousSurvey类
import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase): 
    """ 对AnonymousSurvey类的测试"""
    def setUp(self):
        question = "What language did you first learn to speak?" 
        self.my_survey = AnonymousSurvey(question) 
        self.responses = ['English', 'Spanish', 'Mandarin']

    def test_store_single_response(self):
        self.my_survey.store_response(self.responses[0]) 
        self.assertIn(self.responses[0], self.my_survey.responses)

    def test_store_three_responses(self):
        for response in self.responses:
            self.my_survey.store_response(response) 
        for response in self.responses:
            self.assertIn(response, self.my_survey.responses)

unittest.main()
  • 注意:
    不建议在for循环中修改列表!
    如果需要类似的情形,可以再建一个空列表,把新元素根据需要append()进去。如果要删除列表元素,可以这样:

    for star in stars.sprites().copy():
                       stars.remove(star)

    还有,下面的程序只有暂时效果,是修改不了列表的!

    list = ['ni', 'hao', 'liang', 'cong']
    for item in list:
      item = 'hi'
    
    #实际上并不能修改!只有list[x] = y才能修改!
    

猜你喜欢

转载自blog.csdn.net/twllx/article/details/75712348