Python-测试代码
测试是软件开发中不可或缺的环节,它能确保代码按预期运行,并在修改时快速发现潜在问题。本章将深入讲解如何为函数和类编写测试代码,涵盖单元测试、断言方法、异常处理等核心知识点,帮助开发者构建健壮可靠的程序。
一、测试函数
1.1 单元测试和测试用例
单元测试用于验证代码中最小可测试单元(如函数或方法)的行为是否符合预期。
测试用例是一组测试的集合,通常对应一个文件或模块。Python 的 unittest 模块提供了编写测试用例的工具。
示例:
1.2 可通过的测试
编写测试时,首先要确保代码在正常逻辑下能通过测试。例如,测试 add(2, 3) 是否返回 5。若测试通过,控制台会显示 OK,表明当前代码行为正确。
1.3 未通过的测试
当代码存在问题时,测试会失败。例如,若将 add 函数错误地改为 return a * b,运行测试会提示 AssertionError,指出预期结果与实际不符。
意义:失败的测试帮助开发者定位问题,是调试的重要依据。
1.4 测试未通过时怎么办
1. 阅读错误信息:明确断言失败的原因。
2. 检查代码逻辑:确认函数实现是否有误。
3. 修复代码:修正问题后重新运行测试。
4. 避免绕过问题:不要为了通过测试而修改断言条件,而是修复底层逻辑。
1.5 添加新测试
为覆盖更多场景,需不断扩展测试用例。例如,测试负数相加、字符串拼接等:
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -2), -3)
def test_add_strings(self):
self.assertEqual(add("Hello", " World"), "Hello World")
二、测试类
2.1 各种断言方法
unittest 提供多种断言方法,适用于不同场景:
- assertEqual(a, b):验证 a == b
- assertTrue(x):验证 x 为真
- assertIn(a, b):验证 a 在 b 中
- assertRaises(ErrorType):验证是否抛出指定异常
2.2 测试一个类
假设有一个 User 类需要测试:
class User:
def __init__(self, name):
self.name = name
self.login_attempts = 0
def increment_login_attempts(self):
self.login_attempts += 1
# 测试类
class TestUser(unittest.TestCase):
def test_increment_login_attempts(self):
user = User("Alice")
user.increment_login_attempts()
self.assertEqual(user.login_attempts, 1)
2.3 测试 AnonymousSurvey 类
以调查问卷类为例,测试其存储和统计功能:
class AnonymousSurvey:
def __init__(self, question):
self.question = question
self.responses = []
def store_response(self, response):
self.responses.append(response)
class TestAnonymousSurvey(unittest.TestCase):
def test_store_single_response(self):
survey = AnonymousSurvey("What language do you speak?")
survey.store_response("English")
self.assertIn("English", survey.responses)
2.4 方法 setUp()
setUp() 方法用于在每个测试方法执行前初始化公共资源,避免重复代码。例如:
class TestAnonymousSurvey(unittest.TestCase):
def setUp(self):
self.survey = AnonymousSurvey("What language do you speak?")
self.responses = ["English", "Spanish", "Mandarin"]
def test_store_responses(self):
for response in self.responses:
self.survey.store_response(response)
self.assertEqual(len(self.survey.responses), 3)
- setUp() 会自动在每个测试方法(如 test_store_responses)前运行。
三、小结
1. 测试函数:通过断言验证函数行为,覆盖正常和异常场景。
2. 测试类:使用断言方法验证类的属性和方法,结合 setUp() 提高效率。
3. 测试的价值:及早发现错误,提升代码可维护性,支持后续重构。
结语
掌握测试代码的编写是成为专业开发者的关键一步。通过本章的学习,你已能使用 unittest 框架为函数和类构建全面的测试用例。记住:好的测试不是负担,而是代码稳健运行的基石。