Python单元测试(doctest和unittest)
docstring
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def collect_vowels(s): """ (str) -> str Return the vowels (a, e, i, o, and u) from s. >>> collect_vowels('Happy Anniversary!') 'aAiea' >>> collect_vowels('xyz') '' """ vowels = '' for char in s: if char in 'aeiouAEIOU' : vowels = vowels + char return vowels |
通常我们可以在Python函数的docstring总编写一些测试用例其格式如下:
1 2 3 4 | >>>func(param1) return_value1 >>>func(param2) return_value2 |
doctest
使用Python的doctest库,可以一次性运行函数中所有的测试用例。
直接在交互式会话中
1 2 3 | >>> import doctest >>> doctest.testmod() TestResults(failed = 0 , attempted = 2 ) |
或在模块末尾中加入:
1 2 3 | if __name__ = = '__main__' : import doctest doctest.testmod() |
这样,每次在调用模块时都会先进行单元测试。
unitest
Python的unittest模块提供了类似doctest
的测试框架。但是和doctest
不同,unittest
可以和待测试的函数分开编写。
如下的doctest
可以被翻译成对应unittest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def get_divisors(num, possible_divisors): '' ' ( int , list of int ) -> list of int Return a list of the values from possible_divisors that are divisors of num. >>> get_divisors(8, [1, 2, 3]) [1, 2] >>> get_divisors(4, [-2, 0, 2]) [-2, 2] '' ' divisors = [] for item in possible_divisors: if item != 0 and num % item == 0: if num % item == 0: divisors.append(item) return divisors |
对应的unittest
如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import unittest import divisors class TestDivisors(unittest.TestCase): "" "Example unittest test methods for get_divisors." "" def test_divisors_example_1(self): "" "Test get_divisors with 8 and [1, 2, 3]." "" actual = divisors.get_divisors(8, [1, 2, 3]) expected = [1, 2] self.assertEqual(expected, actual) def test_divisors_example_2(self): "" "Test get_divisors with 4 and [-2, 0, 2]." "" actual = divisors.get_divisors(4, [-2, 0, 2]) expected = [-2, 2] self.assertEqual(expected, actual) |
调用unittest.main(),会检查当前模块内所有TestCase的子类,然后带用以”test”开头的方法,报告不符合预期的结果。
当在IDLE中调用unittest时,形参exit应当被赋值为False:unittest.main(exit=False)
一般地,每一个待测试的函数有一个TestCase子类,每一次函数调用对应一个test方法。
选择测试用例
一般在选择测试用例时,考虑一下因素:
- 大小
- 对于集合(string,list,tuple,dict)
- 空集合
- 单元素集
- 最少数量用例
- 较多用例
- 对分
- 奇数/偶数
- 正/负
- 空/满
- 边界
- 函数在接近阈值的时候处理不同,测试阈值。
- 顺序
- 函数对不同顺序的输入值,测试不同的顺序。
通常不同的种类会有重叠,所以一个测试用例可能归属于不止一个类别。
参考链接:https://shenweichen.blog.csdn.net/article/details/77511806?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs&dist_request_id=1332048.19908.16195107625431303&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具