python单元测试模块unittest简单用法
- 导入unittest类,import unittest、from unittest import TestCase
- 如果需要测试键盘输入和输出需要导入mock类的patch装饰器和StringIO,from unittest.mock import patch、from io import StringIO
- 建立测试类class MyTestCase(TestCase),这里的名字随意,但是一定要继承自TestCase。
- 在这个类里建立测试方法def test_Function(self)
- 最后通过unittest.main()调用所有测试方法
我用一个简单的例子来说明使用方法:
import unittest
import test_First#这是我自己写的一个脚本文件
from unittest.mock import patch
from io import StringIO
from unittest import TestCase
class MyTestCase(TestCase):
def test_DNA_func_inner(self):
with open(r'test_data.txt','r') as f:
test_data_arr=f.readlines()
#使用test_data_arr列表中的数据替换input(),每个记录替换一行的input()函数
with patch('builtins.input', side_effect=test_data_arr) as mock_stdin:
with patch('sys.stdout', new_callable=StringIO) as mock_stdout:
test_First.func1()
output=mock_stdout.getvalue()
self.assertEqual(output, '11674463 11674463\n')
@patch('builtins.input', side_effect=['6', 'a b c aa d b','1 2 3 4 5 6','3','1 5 caaab', '0 4 xyz', '2 4 bcdybc'])
@patch('sys.stdout', new_callable=StringIO)
def test_DNA_func_essy1(self, mock_stdout,mock_stdin):
#这个测试方法为什么需要3个参数,而上面的只需要两个,不清楚为什么,可能是因为每个patch都会为方法增加一个位置参数,离方法最近的patch对应第一个位置参数
test_First.func()
output=mock_stdout.getvalue()
self.assertEqual(output, '0 19\n')
if __name__=='__main__':
unittest.main()
如果不用测试键盘输入、输出的话,就简单很多,直接在类中定义测试函数,然后调用自己的函数就可以了,被测函数使用参数,在函数里给予就可以了,省去了嵌套方法和模拟输入、输出的步骤。
关于模拟对象库mock的详细内容还是要看官方文档:
mock类的详细使用方法:https://docs.python.org/3/library/unittest.mock.html