python基础知识——测试代码

1. 测试函数

1.1 创建测试用例

  • 1 import unittest
    2 from name_func import get_name
    3 
    4 class NamesTestCase(unittest.TestCase):
    5     def test_first_last_name(self):
    6         name = get_name('janis', 'joplin')
    7         self.assertEqual(name, 'Janis Joplin')
    8 
    9 unittest.main()

    运行结果

    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.014s
    
    OK
  • 首先导入模块unittest和要测试的函数get_name()
  • 在第4行处,创建了一个名为NamesTestCase的类,用于包含一系列针对get_name()函数的单元测试,这个类必须继承unittest.TestCase类,这样python才能知道如何运行你编写的测试
  • 用于测试函数的方法名必须以test_开头,这样它才能在我们运行程序时自动运行
  • 在第7行使用了unittest类最有用的功能之一:断言方法。断言方法用来核实得到的结果是否与期望的结果一致
  • 第7行的意思即:将name的值和字符串"Janis Joplin"进行比较,若他们相等,则万事大吉;否则,要提示我
  • 第9行,unittest.main()让python运行这个文件中的测试
  • 若测试包含中间名的姓名,则测试未通过,如下所示
  • def test_first_last_name(self):
            name = get_name('janis', 'joplin', 'abc')
            self.assertEqual(name, 'Janis Joplin Abc')

    运行结果

    E
    ======================================================================
    ERROR: test_first_last_name (__main__.NamesTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "D:\Python\codes\7-24-01.py", line 6, in test_first_last_name
        name = get_name('janis', 'joplin', 'abc')
    TypeError: get_name() takes 2 positional arguments but 3 were given
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.009s
    
    FAILED (errors=1)

 2. 测试类

2.1 一个要测试的类

  • class AnonymousSurvey():
        '''收集匿名调查问卷的答案'''
    
        def __init__(self, question):
            '''存储一个问题,并为存储答案做准备'''
            self.question = question
            self.responses = []
    
        def store_response(self, new_resp):
            '''存储单份调查答卷'''
            self.responses.append(new_resp)

2.2 测试AnonymousSurvey类

  • import unittest
    from survey import AnonymousSurvey
    
    class TestAnonymousSurvey(unittest.TestCase):
        '''针对AnonymouSuvey类的测试'''
    
        def test_store_single_response(self):
            '''测试单个答案的存储'''
            question = "What language did you first learn to speak?"
            my_survey = AnonymousSurvey(question)
            my_survey.store_response('English')
    
            self.assertIn('English', my_survey.responses)
    
        def test_store_three_response(self):
            '''测试三个答案的存储'''
            question = "What language did you first learn to speak?"
            my_survey = AnonymousSurvey(question)
            responses = ['English', 'Spanish', 'Chinese']
            for response in responses:
                my_survey.store_response(response)
    
            for response in responses:
                self.assertIn(response, my_survey.responses)
    
    unittest.main()

    运行结果

    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.012s
    
    OK
  • 这两个测试有些重复的地方,创建了两个AnonymousSurvey实例,并在每个方法中都创建了答案。下面使用unittest.TestCase类的方法setUp()来提高它们的效率,可以只创建一次实例,并在每个测试方法中使用它们

2.3 方法setUp()

  • class TestAnonymousSurvey(unittest.TestCase):
        '''针对AnonymouSuvey类的测试'''
    
        def setUp(self):
            '''创建一个调查对象和一组答案,供测试方法使用'''
            question = "What language did you first learn to speak?"
            self.my_survey = AnonymousSurvey(question)
            self.responses = ['English', 'Spanish', 'Chinese']
    
        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()

    运行结果

    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.012s
    
    OK
  • 若在类中包含了方法setUp(),python将先运行它,再运行各个以test_打头的方法,这样在每个测试方法中都可使用在setUp()中创建的对象
  • setUp()方法将实例和答案列表存储在属性中,因此可在这个类的任何地方使用
  • 运行测试用例时,每完成一个单元测试,python都打印一个字符:
    • 测试通过时打印一个句点
    • 测试引发错误时打印一个E
    • 测试导致断言失败时打印一个F
上一篇:Pytest执行unittest TestSuite(测试套件)的方法


下一篇:python接口自动化- unittest-生成测试报告