Python基础入门 Day96 单元测试与unittest模块

89次阅读
没有评论

共计 2194 个字符,预计需要花费 6 分钟才能阅读完成。

在开发过程中,代码编写完成后需要进行测试,以确保其正确性和稳定性。Python 提供了 unittest 模块,这是一个内置的单元测试框架,可以帮助我们编写测试用例、组织测试套件,并自动化执行测试。

  1. 什么是单元测试
    单元测试(Unit Testing)是针对程序中的最小功能单元(如函数或类方法)进行的测试。它的目标是验证每个功能单元是否按预期工作。
  • 优点:能快速发现错误,保证代码质量。
  • 缺点:需要花费时间编写测试代码。
  1. 编写第一个测试用例
    下面是一个简单的示例,测试一个求和函数是否正确。
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() 等方法来验证结果。
  1. 常用断言方法
  • 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) 时是否抛出指定异常。
  1. 组织多个测试用例
    我们可以将多个测试函数组织在一个测试类中,或者多个测试类组成一个测试套件。
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()

这样在运行时,所有的测试用例会自动执行。

  1. 设置测试的前置和后置操作
    在某些情况下,测试之前需要准备环境,测试之后需要清理资源。我们可以使用 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() 在每个测试方法执行后运行。
  1. 测试套件与批量执行
    如果有多个测试文件,可以使用 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 模块,我们可以:

  • 编写和组织测试用例。
  • 使用断言方法验证结果。
  • 设置前置与后置操作。
  • 组合测试套件实现批量测试。

练习与思考:

  1. 编写一个函数 is_prime(n) 判断是否为质数,并为其编写单元测试。
  2. 为一个类 Calculator 编写加、减、乘、除的测试用例。
  3. 思考如何利用 unittest 实现持续集成(CI)中的自动化测试。
正文完
 0
评论(没有评论)