什么是 unittest?
unittest
是 Python 的内置测试框架,用于编写和运行测试用例。它提供了丰富的断言方法和组织测试用例的方式,使得编写单元测试变得更加简单和高效。
为什么使用 unittest?
1. 自动化测试:可以自动运行测试用例,节省时间和精力。2. 代码质量保证:通过测试确保代码的正确性和稳定性。3. 文档作用:测试用例可以作为代码的文档,帮助理解和维护代码。
安装和导入
unittest
是 Python 的标准库,无需安装,直接导入即可:
import unittest
基本概念
测试用例(TestCase)
测试用例是 unittest
中最基本的测试单位,通常是一个类,继承自 unittest.TestCase
。每个测试方法以 test_
开头。
断言(Assertions)
断言用于验证测试结果是否符合预期。unittest
提供了多种断言方法,如 assertEqual
、assertTrue
等。
测试套件(TestSuite)
测试套件用于组织多个测试用例,可以将多个测试用例组合在一起运行。
测试加载器(TestLoader)
测试加载器用于加载测试用例,可以自动发现并加载指定目录下的测试用例。
测试运行器(TestRunner)
测试运行器用于执行测试用例,并生成测试报告。
示例:基本测试用例
让我们从一个简单的例子开始,编写一个测试用例来验证一个函数的功能。
import unittest
def add(a, b):
return a + b
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(1, 2), 3) # 验证 1 + 2 = 3
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -2), -3) # 验证 -1 + -2 = -3
if __name__ == '__main__':
unittest.main()
运行测试
保存上述代码为 test_add.py
,然后在命令行中运行:
python test_add.py
输出结果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
更多断言方法
unittest
提供了多种断言方法,常用的有:
assertEqual(a, b)
:验证a == b
assertTrue(x)
:验证x
为真assertFalse(x)
:验证x
为假assertIn(a, b)
:验证a
在b
中assertNotIn(a, b)
:验证a
不在b
中assertRaises(exception, callable, *args, **kwargs)
:验证调用callable
时会抛出exception
异常
示例:使用更多断言方法
import unittest
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
class TestDivideFunction(unittest.TestCase):
def test_divide_positive_numbers(self):
self.assertEqual(divide(10, 2), 5) # 验证 10 / 2 = 5
def test_divide_negative_numbers(self):
self.assertEqual(divide(-10, -2), 5) # 验证 -10 / -2 = 5
def test_divide_by_zero(self):
with self.assertRaises(ValueError): # 验证除以零会抛出 ValueError
divide(10, 0)
if __name__ == '__main__':
unittest.main()
测试套件和测试加载器
我们可以使用 TestSuite
和 TestLoader
来组织和加载多个测试用例。
import unittest
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(1, 2), 3)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -2), -3)
class TestDivideFunction(unittest.TestCase):
def test_divide_positive_numbers(self):
self.assertEqual(divide(10, 2), 5)
def test_divide_negative_numbers(self):
self.assertEqual(divide(-10, -2), 5)
def test_divide_by_zero(self):
with self.assertRaises(ValueError):
divide(10, 0)
if __name__ == '__main__':
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTests(loader.loadTestsFromTestCase(TestAddFunction))
suite.addTests(loader.loadTestsFromTestCase(TestDivideFunction))
runner = unittest.TextTestRunner()
runner.run(suite)
实战案例:测试一个简单的类
假设我们有一个 Calculator
类,包含加法和减法方法,我们需要为其编写测试用例。
import unittest
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
class TestCalculator(unittest.TestCase):
def setUp(self):
self.calc = Calculator() # 初始化 Calculator 对象
def test_add(self):
self.assertEqual(self.calc.add(1, 2), 3) # 验证 1 + 2 = 3
def test_subtract(self):
self.assertEqual(self.calc.subtract(10, 5), 5) # 验证 10 - 5 = 5
if __name__ == '__main__':
unittest.main()
总结
本文介绍了 Python 中的 unittest
框架,包括其基本概念、常用断言方法、测试套件和测试加载器的使用。通过多个示例,逐步展示了如何编写和运行测试用例。最后,通过一个实战案例,进一步巩固了对 unittest
的理解和应用。
好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!
付费合集推荐
文末福利
公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。