在python中使用单元测试unittest
大家好,欢迎来到我的技术乐园!今天,我们将一起踏入Python单元测试的奇妙旅程,探索这个让我们的代码更可靠、更强壮的令人愉快的世界。
前言:为什么单元测试如此重要?
在我们开始冒险之前,先来思考一下为什么单元测试如此重要。嗯,首先,它们让我们的代码更可靠,保证了我们的函数和方法按照预期运行。而且,单元测试还是代码质量的守护者,一旦引入新的功能或者修复一个Bug,只需运行测试,就能够确保不会对现有的功能产生负面影响。
第一步:准备好你的工具
在我们的冒险开始之前,确保你已经准备好了最重要的武器:Python和unittest模块。当然,你也可以选择其他测试框架,但unittest是Python内建的,简单而有效。
# unitest_example1.pyimport unittestclass MyTestCase(unittest.TestCase):def test_hello_world(self):result = "Hello, World!"self.assertEqual(result, "Hello, World!")
第二步:让测试跑起来!
现在,让我们看看这个测试是如何运作的。简单的测试函数,通过 assertEqual
断言我们的结果是否和期望一致。运行测试:
python -m unittest unittest_example1.py
第三步:享受成功的快感
你听到了吗?那是代码在默默地说:“我没有Bug!” 这种感觉,就像是踏入夏日冰淇淋店的凉意,清新又令人愉悦。
第四步:扩展你的冒险
单元测试的美妙之处在于,一旦你开始,你就会迷上它。不断扩展你的测试套件,覆盖更多的代码路径。尝试参数化测试,用更少的代码覆盖更多的场景。
注意:parameterized.expand
并不是 unittest
模块中的一部分,它实际上来自于 parameterized
模块,该模块并不是 Python 标准库的一部分。为了使用 parameterized.expand
,您需要安装 parameterized
模块。
pip install parameterized
#!/usr/bin/env python
# coding=utf-8
# @Time : 2024/1/31 15:40# unittest_examples2.pyimport unittestfrom parameterized import parameterizeddef add_numbers(a, b):return a + bclass AdvancedTestCase(unittest.TestCase):@parameterized.expand([("case1", 1, 2, 3),("case2", -1, 2, 1),("case3", 0, 0, 0),("case4", 0, 0, 2),])def test_addition(self, name, a, b, expected):result = add_numbers(a, b)self.assertEqual(result, expected)if __name__ == '__main__':unittest.main()# python -m unittest unittest_examples2.py
# python3 -m unittest unittest_examples2.py
我特意加了一个错误的case4,运行代码:
python3 -m unittest unitest_example2.py
结语:单元测试是一场愉快的冒险!
在我们的技术冒险中,我们发现了单元测试的美妙之处。它不仅保护了我们的代码,还让我们充满信心地迎接新的挑战。所以,让我们继续这场愉快的冒险,发现更多Python技术的乐趣吧!
附录
完整代码:
#!/usr/bin/env python
# unitest_example1.pyimport unittestclass MyTestCase(unittest.TestCase):def setUp(self):# 在测试前的准备工作self.data = [1, 2, 3]def test_something(self):# 测试代码result = 1 + 1# 使用 assert 断言检查结果是否等于 2self.assertEqual(result, 2)# 使用 assert 断言检查列表中是否包含特定元素self.assertIn(2, self.data)# 使用 assert 断言检查条件是否为真self.assertTrue(result == 2)# 使用 assert 断言检查条件是否为假self.assertFalse(result != 2)# 使用 assert 断言检查两个值是否不相等self.assertNotEqual(result, 3)# 使用 assert 断言检查某个值是否为 Noneself.assertIsNone(None)# 使用 assert 断言检查某个值是否不为 Noneself.assertIsNotNone(result)# 使用 assert 断言检查字符串是否以特定前缀开头self.assertTrue("hello".startswith("he"))def tearDown(self):# 在测试后的清理工作del self.datadef run():loader = unittest.TestLoader()suite = loader.loadTestsFromTestCase(MyTestCase)if __name__ == "__main__":unittest.main()