python接口单元测试mock的问题整理

0 评论
/ /
709 阅读
/
3570 字
19 2020-12

示例代码,可以参考https://blog.csdn.net/younger_china/article/details/72904448

#!/usr/bin/env python# -*-coding:utf-8-*-import os
import unittest
from unittest import mock
import pysnooper

def multiple(a, b):
    return a * b

class Calculator(object):
    @pysnooper.snoop()
    def is_error(self):
        try:
            os.mkdir("11")
            return False        
        except Exception as e:
            return True    

    def add(self, a, b):
        return a + b

class TestProducer(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()

    @pysnooper.snoop()
    @mock.patch('os.mkdir')
    def test_exception(self, mock_mkdir):
        mock_mkdir.side_effect = Exception        
        self.assertEqual(self.calculator.is_error(), True)

    @pysnooper.snoop()
    @mock.patch.object(Calculator, 'add')
    @mock.patch('mytest.multiple')
    def test_both(self, mock_multiple, mock_add):
        mock_add.return_value = 1        
        mock_multiple.return_value = 2        
        self.assertEqual(self.calculator.add(8, 14), 1)
        self.assertEqual(multiple(8, 14), 2)

    @pysnooper.snoop()
    @mock.patch('mytest.multiple')
    def test_multiple(self, mock_multiple):
        mock_multiple.return_value = 3        
        self.assertEqual(multiple(8, 14), 3)

    @mock.patch.object(Calculator, 'add')
    def test_effect(self, mock_add):
        mock_add.side_effect = [1, 2, 3]
        self.assertEqual(self.calculator.add(8, 14), 1)
        self.assertEqual(self.calculator.add(8, 14), 2)
        self.assertEqual(self.calculator.add(8, 14), 3)


if __name__ == "__main__":
    unittest.main()

模拟测试一个项目,只需要了解它用在哪里,而不是它从哪里来。

1、如果要mock的方法不在当前测试接口(方法)所在的py文件中,是在另一个py文件中定义的单独方法(不是类方法)mock的时候,直接从当前接口所在的py文件引入

@mock.patch.object(MigrationTaskQueue, "_update_status")
@mock.patch.object(MigrationTaskQueue, "add_task")
@mock.patch("taskmanager.views_home.check_path")
@mock.patch("taskmanager.views_home.check_platform")
def test_build_migration_scan_sec(self, mock_plat, mock_path, mock_add_task, mock_update_status):
    pass

2、如果要mock的方法不在当前测试接口(方法)所在的py文件中,是在另一个py文件中定义的类方法mock的时候,直接从当前测试的接口所在的py文件引入

@mock.patch.object(MigrationTaskQueue, "_update_status")
@mock.patch.object(MigrationTaskQueue, "add_task")
@mock.patch("taskmanager.views_home.check_path")
@mock.patch("taskmanager.views_home.check_platform")
def test_build_migration_scan_sec(self, mock_plat, mock_path, mock_add_task, mock_update_status):
    pass

3、如果要mock的方法在当前测试接口(方法)所在的py文件中mock的时候,如何引用呢

@mock.patch.object(TaskQueue, "_update_status")
@mock.patch.object(TaskQueue, "add_task")
def test_manage_whitlist_sec(self, mock_add_task, mock_update_status):
    pass@mock.patch.object(TaskQueue, "_update_status")
@mock.patch.object(TaskQueue, "add_task")
def test_manage_whitelist(self, mock_add_task, mock_update_status):
    pass

查看自己单元测试的覆盖率情况,可以按照如下步骤操作,查看

使用coverage命令来运行单元测试

 # python3manage.pytest tests/testcase    #原来的运行命令
 coverage run--source'.'manage.pytest tests/testcase   #使用coverage替换
 coverage html  #生成html