python - 代码测试

单元测试用于核实函数的某个方面没有问题。
测试用例是一组单元测试,核实函数在各种情形下都符合要求。
全覆盖的测试用例包含了一整套单元测试,涵盖了各种可能的函数使用方式。

1. 对函数进行测试

name_function.py

def get_formatted_name(first, last):
    """生成整洁的姓名"""
    full_name = f"{first.title()} {last.title()}"
    return full_name

test_name_function.py

import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
    """测试get_formatted_name()函数"""
    
    def test_first_last_name(self):
        """能够正确处理Tom Hanks这样的姓名吗?"""
        formatted_name = get_formatted_name('tom', 'hanks')
        self.assertEqual(formatted_name, 'Tom Hanks')      # 断言
        
if __name__ == '__main__':
    unittest.main()

2. 对类进行测试

2.1 各种断言方法

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中

2.2 待测试的类

survey.py

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

    def show_question(self):
        """显示调查问卷"""
        print(self.question)

    def store_response(self, new_response):
        """存储单份调查答卷。"""
        self.responses.append(new_response)

    def show_results(self):
        """显示收集到的所有答卷"""
        print("Survey results:")
        for response in self.responses:
            print(f"- {response}")

language_survey.py

from survey import AnonymousSurvey

# 定义一个问题,并创建一个调查。
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)

# 显示问题并存储答案
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
	response = input("Language: ")
	if response == 'q':
		break
	my_survey.store_response(response)

# 显示调查结果
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()

2.3 测试代码

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)

if __name__ == '__main__':
    unittest.main()

2.3 测试代码优化

setUp()方法先运行,再运行test_打头的方法

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)

if __name__ == '__main__':
    unittest.main()

运行测试用例时,每完成一个单元测试,python都打印一个字符:测试通过打印一个句点,测试引发错误打印一个E,测试导致断言失败打印一个F。

posted @ 2023-07-10 07:52  钱塘江畔  阅读(69)  评论(0)    收藏  举报