示例代码,可以参考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