Python - 单元测试
总结
一、如何进行单元测试
注意点:
- import unittest
- 需要创建一个类TestSort,继承类‘unittest.TestCase’
- 然后,在这个类TestSort中定义相应的测试函数 test_sort(),进行测试。注意,测试函数要以‘test’开头
- 而测试函数的内部,通常使用 assertEqual()、assertTrue()、assertFalse() 和 assertRaise() 等 assert 语句对结果进行验证。
import unittest # 将要被测试的排序函数 def sort(arr): l = len(arr) for i in range(0, l): for j in range(i + 1, l): if arr[i] >= arr[j]: tmp = arr[i] arr[i] = arr[j] arr[j] = tmp # 编写子类继承unittest.TestCase class TestSort(unittest.TestCase): # 以test开头的函数将会被测试 def test_sort(self): arr = [3, 4, 1, 5, 6] sort(arr) # assert 结果跟我们期待的一样 self.assertEqual(arr, [1, 3, 4, 5, 6]) if __name__ == '__main__': ## 如果在Jupyter下,请用如下方式运行单元测试 unittest.main(argv=['first-arg-is-ignored'], exit=False) ## 如果是命令行下运行,则: ## unittest.main() ## 输出 .. ---------------------------------------------------------------------- Ran 2 tests in 0.002s OK
二、单元测试如何替换依赖项
mock - 屏蔽复杂逻辑
我们定义了一个类的三个方法 m1()、m2()、m3()。我们需要对 m1() 进行单元测试,但是 m1() 取决于 m2() 和 m3()。如果 m2() 和 m3() 的内部比较复杂, 你就不能只是简单地调用 m1() 函数来进行测试. 我们可以:
- 把 m2() 替换为一个返回具体数值的 value,
- 把 m3() 替换为另一个 mock(空函数)
这样,测试 m1() 就很容易了,我们可以测试 m1() 调用 m2(),并且用 m2() 的返回值调用 m3()。
import unittest from unittest.mock import MagicMock class A(unittest.TestCase): def m1(self): val = self.m2() self.m3(val) def m2(self): pass def m3(self, val): pass def test_m1(self): a = A() a.m2 = MagicMock(return_value="custom_val") a.m3 = MagicMock() a.m1() self.assertTrue(a.m2.called) #验证m2被call过 a.m3.assert_called_with("custom_val") #验证m3被指定参数call过 if __name__ == '__main__': unittest.main(argv=['first-arg-is-ignored'], exit=False) ## 输出 .. ---------------------------------------------------------------------- Ran 2 tests in 0.002s OK
mock side_effect - 屏蔽复杂逻辑的同时,可以根据不同的输入返回不同的数值
比如下面这个示例,测试的是输入参数是否为负数,输入小于 0 则输出为 1 ,否则输出为 2。
from unittest.mock import MagicMock def side_effect(arg): if arg < 0: return 1 else: return 2 mock = MagicMock() mock.side_effect = side_effect mock(-1) 1 mock(1) 2
patch
需要再理解:http://www.manongjc.com/detail/51-aqimxrkdzrjvtlu.html
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-10-25 设计模式 - 静态代理 VS 动态代理