共计 2194 个字符,预计需要花费 6 分钟才能阅读完成。
在开发过程中,代码编写完成后需要进行测试,以确保其正确性和稳定性。Python 提供了 unittest 模块,这是一个内置的单元测试框架,可以帮助我们编写测试用例、组织测试套件,并自动化执行测试。
- 什么是单元测试
单元测试(Unit Testing)是针对程序中的最小功能单元(如函数或类方法)进行的测试。它的目标是验证每个功能单元是否按预期工作。
- 优点:能快速发现错误,保证代码质量。
- 缺点:需要花费时间编写测试代码。
- 编写第一个测试用例
下面是一个简单的示例,测试一个求和函数是否正确。
import unittest
# 待测试的函数
def add(a, b):
return a + b
# 测试类
class TestAddFunction(unittest.TestCase):
def test_add_integers(self):
self.assertEqual(add(2, 3), 5) # 2+3 应该等于 5
def test_add_floats(self):
self.assertAlmostEqual(add(2.5, 3.1), 5.6) # 浮点数比较
def test_add_strings(self):
self.assertEqual(add("Hello", "World"), "HelloWorld") # 字符串拼接
if __name__ == "__main__":
unittest.main()
运行后,unittest 会自动执行测试类中的方法。
- 测试函数必须以
test_开头。 - 使用
assertEqual()、assertTrue()、assertRaises()等方法来验证结果。
- 常用断言方法
assertEqual(a, b):检查a == b。assertNotEqual(a, b):检查a != b。assertTrue(x):检查x为真。assertFalse(x):检查x为假。assertIsNone(x):检查x is None。assertIsInstance(a, cls):检查对象是否是指定类的实例。assertRaises(exc, func, *args):检查运行func(*args)时是否抛出指定异常。
- 组织多个测试用例
我们可以将多个测试函数组织在一个测试类中,或者多个测试类组成一个测试套件。
import unittest
def multiply(a, b):
return a * b
class TestMathFunctions(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
def test_multiply(self):
self.assertEqual(multiply(2, 3), 6)
if __name__ == "__main__":
unittest.main()
这样在运行时,所有的测试用例会自动执行。
- 设置测试的前置和后置操作
在某些情况下,测试之前需要准备环境,测试之后需要清理资源。我们可以使用setUp()和tearDown()方法:
import unittest
class TestFileOperations(unittest.TestCase):
def setUp(self):
self.test_file = open("test.txt", "w")
self.test_file.write("Hello Python")
self.test_file.close()
def tearDown(self):
import os
os.remove("test.txt")
def test_file_content(self):
with open("test.txt", "r") as f:
content = f.read()
self.assertEqual(content, "Hello Python")
if __name__ == "__main__":
unittest.main()
setUp()在每个测试方法执行前运行。tearDown()在每个测试方法执行后运行。
- 测试套件与批量执行
如果有多个测试文件,可以使用unittest.TestLoader来批量加载:
import unittest
def suite():
suite = unittest.TestSuite()
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(TestAddFunction))
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(TestMathFunctions))
return suite
if __name__ == "__main__":
runner = unittest.TextTestRunner()
runner.run(suite())
这样就能批量执行多个测试类的测试用例。
总结:
单元测试是保证代码质量的重要手段。通过 unittest 模块,我们可以:
- 编写和组织测试用例。
- 使用断言方法验证结果。
- 设置前置与后置操作。
- 组合测试套件实现批量测试。
练习与思考:
- 编写一个函数
is_prime(n)判断是否为质数,并为其编写单元测试。 - 为一个类
Calculator编写加、减、乘、除的测试用例。 - 思考如何利用
unittest实现持续集成(CI)中的自动化测试。
正文完