欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python基础:测试代码

程序员文章站 2024-03-21 22:27:10
...

Python标准库中的模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。

测试函数

要学习测试,得有要测试的代码。下面是一个简单的函数,它接受名和姓并返回整洁的姓名:

name_function.py

def get_formatted_name(first, last):
	'''Generate a neatly formatted full name.'''
	full_name = first + ' ' +last
	return full_name.title()

要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。

方法名必须以test打头,这样它才会在我们运行test_name_function.py时自动运行。

test_name_function.py

import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
	''' 测试name_function.py'''
	
	def test_first_last_name(self):
		'''能够正确地处理像Janis Jolin这样的姓名吗?'''
		formatted_name = get_formatted_name('janis', 'joplin')
		self.assertEqual(formatted_name, "Janis Joplin")
		
unittest.main()

Python基础:测试代码

下表列出了6个常用的断言方法。

方法 用途
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 中

测试类

类的测试与函数的测试相似。来看一个帮助管理匿名调查的类:

survey.py

class AnonymousSurvey():
    """收集匿名调查问卷的答案"""
    
    def __init__(self, question):
        """存储一个问题,并为存储答案做准备"""
        self.question = question
        self.responses = []
        
    def show_question(self):
        """显示调查问卷"""
        print(question)
        
    def store_response(self, new_response):
        """存储单份调查答卷"""
        self.responses.append(new_response)
        
    def show_results(self):
        """显示收集到的所有答卷"""
        print("Survey results:")
        for response in responses:
            print('- ' + response)  

下面编写一个测试,对AnonymousSurvey类的行为进行验证:我们为问题提供了一些答案,使用assertIn()来核实它包含在答案列表中。

test_survey.py

import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
    '''针对AnonymousSurvey类的测试'''
    
    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_responses(self):
        """测试三个答案会被妥善地存储"""
        question = "What language did you first learn to speak?"
        my_survey = AnonymousSurvey(question)
        responses = ['English', 'Spanish', 'Mandarin']
        for response in responses:
            my_survey.store_response(response)
            
        for response in responses:
            self.assertIn(response, my_survey.responses)     
        
unittest.main()        
Python基础:测试代码

方法setUp()

 在前面的test_survey.py中,我们在每个测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了要测试的答案。unittest.TestCase类包含方法setUp(),让我们只需创建这些对象一次,并能在每个测试方法中使用它们。如果你在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。

下面我们使用setUp()改写test_survey.py

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()        
Similarly, we can provide a tearDown() method that tidies up after the test method has been run:
import unittest

class WidgetTestCase(unittest.TestCase):
    def setUp(self):
        self.widget = Widget('The widget')

    def tearDown(self):
        self.widget.dispose()
If setUp() succeeded, tearDown() will be run whether the test method succeeded or not.



相关标签: python