unittest
是 Python 的标准测试框架,它提供了丰富的功能来支持自动化测试。以下是一个示例,展示了 unittest
框架中多种功能的使用,包括测试类、测试方法、断言、测试套件、测试加载器、测试运行器以及跳过和预期失败的测试。
import unittest
from unittest.mock import patch, MagicMock
# 假设我们有一个要测试的模块
class MyModule:
def add(self, a, b):
return a + b
def divide(self, a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
def print_hello(self):
print("Hello, World!")
# 测试类
class TestMyModule(unittest.TestCase):
def setUp(self):
# 每个测试方法运行之前都会调用
self.module = MyModule()
def test_add(self):
# 测试加法功能
self.assertEqual(self.module.add(1, 2), 3)
def test_divide_positive(self):
# 测试除法功能(正数)
self.assertEqual(self.module.divide(10, 2), 5)
@unittest.skip("demonstrating skipping a test")
def test_divide_zero_skip(self):
# 跳过测试除以零的情况
self.assertRaises(ValueError, self.module.divide, 1, 0)
@unittest.expectedFailure
def test_divide_zero_xfail(self):
# 预期失败的测试,用于已知问题
self.assertEqual(self.module.divide(1, 0), 0) # 实际上会抛出 ValueError
@patch('builtins.print')
def test_print_hello(self, mock_print):
# 测试 print_hello 方法,并捕获 print 调用
self.module.print_hello()
mock_print.assert_called_once_with("Hello, World!")
def test_suite_example(self):
# 通常不直接在测试方法中创建测试套件,这里仅作演示
suite = unittest.TestSuite()
suite.addTest(TestMyModule('test_add'))
# 可以添加更多测试到套件中...
# 注意:通常我们使用 TestLoader 和 TestRunner 来处理套件
# 使用 TestLoader 和 TestRunner 的例子(通常在命令行或脚本的 main 部分)
# 但为了完整性,这里展示如何手动创建和运行测试套件
def run_tests():
suite = unittest.TestLoader().loadTestsFromTestCase(TestMyModule)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
if __name__ == '__main__':
run_tests()
在这个例子中:
setUp
方法在每个测试方法之前运行,用于设置测试环境(如实例化被测对象)。test_add
和test_divide_positive
是普通的测试方法,使用assertEqual
断言来验证结果。test_divide_zero_skip
使用@unittest.skip
装饰器来跳过测试。test_divide_zero_xfail
使用@unittest.expectedFailure
装饰器来标记一个预期会失败的测试。test_print_hello
使用@patch
装饰器来模拟print
函数,并验证其调用。test_suite_example
方法演示了如何手动创建测试套件,但通常我们使用TestLoader
来自动加载测试。run_tests
函数展示了如何使用TestLoader
加载测试,并使用TextTestRunner
运行测试套件。
请注意,虽然 test_suite_example
方法在示例中展示了如何创建测试套件,但在实际使用中,你通常不需要在测试类中手动创建和运行测试套件。相反,可在脚本的 if __name__ == '__main__':
块中调用 run_tests()
函数(如本例所示)来自动发现和运行测试。或在该块中使用 unittest.main()
:
if __name__ == "__main__":
# 启动unittest测试运行器来运行当前模块中的测试
unittest.main()
另一个测试框 架参见:Python 测试框架:pytest(pytest.mark)