Python 测试框架:unittest (unittest.mock)

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) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值