总结
一、如何进行单元测试
注意点:
- 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
标签:arr,Python,unittest,单元测试,m1,m3,m2,self From: https://www.cnblogs.com/frankcui/p/17787337.html