python单元测试模块unittest简单用法

python单元测试模块unittest简单用法

  1. 导入unittest类,import unittest、from unittest import TestCase
  2. 如果需要测试键盘输入和输出需要导入mock类的patch装饰器和StringIO,from unittest.mock import patch、from io import StringIO
  3. 建立测试类class MyTestCase(TestCase),这里的名字随意,但是一定要继承自TestCase。
  4. 在这个类里建立测试方法def test_Function(self)
  5. 最后通过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

Comments are closed.