📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
今天来跟大家聊聊什么是Mock测试以及Mock测试在自动化与性能测试中的最佳实践。
Mock测试,简单来说,就是一种在软件开发中用来“假装”某些东西存在或发生,以便专注于测试目标代码行为的方法。它的核心思想是通过模拟外部依赖或复杂环境,让测试变得更简单、快速和可靠。
1. 什么是“假装”?
在开发中,我们的代码往往依赖于外部的东西,比如数据库、网络接口、其他模块等。但这些东西在测试时可能会带来麻烦,比如:
-
数据库可能还没建好。
-
网络接口可能不稳定。
-
依赖的模块还没写完。
这时候,我们就可以用“假装”的方式,把这些依赖替换成一个“假的”版本,也就是Mock。这个“假的”东西会按照我们设定的规则运行,而不会真的去调用真实的数据库、网络接口等。
2. 为什么要用Mock测试?
-
隔离依赖:把复杂的外部环境隔离开,专注于测试目标代码本身的行为。
-
快速测试:不用等外部依赖准备好,也不用依赖真实环境,测试速度更快。
-
验证交互:可以检查代码是否正确地与外部依赖“交流”,比如是否调用了正确的函数,传了正确的参数。
3. 举个例子
假设你写了一个函数,它的任务是“根据天气预报决定是否带伞”。这个函数会调用一个天气预报接口来获取天气情况。但天气预报接口可能还没写好,或者需要联网才能用。
这时候,你可以用Mock测试:
-
假装天气预报接口返回“晴天”,看看你的函数是否输出“不用带伞”。
-
假装天气预报接口返回“下雨”,看看你的函数是否输出“带伞”。
通过这种方式,你可以专注于测试你的函数逻辑,而不用真的去调用天气预报接口。
4. Mock测试的用途
-
模拟外部服务:比如假装支付接口成功或失败,测试你的代码是否正确处理。
-
验证交互:比如假装用户点击了某个按钮,检查代码是否正确响应。
-
测试异常情况:比如假装网络断了,看看代码是否能优雅地处理。
下面是Mock 在自动化测试与性能测试中的深入应用
Mock 测试在自动化测试和性能测试中扮演重要角色,尤其在隔离依赖、模拟极端场景和提升测试效率方面。以下是具体场景和实战案例:
一、自动化测试中的 Mock 应用
1. 场景:微服务接口自动化测试
问题:
在微服务架构中,服务 A 依赖服务 B 的接口返回数据。若直接调用真实服务 B:
•服务 B 未开发完成时,测试会被阻塞•服务 B 的故障会导致服务 A 的测试失败(测试耦合)
Mock 方案:
使用 Mock Server(如 pytest-httpserver
)模拟服务 B 的接口,返回预定义数据。
案例代码:
import requests
from pytest_httpserver import HTTPServer
def test_service_a(httpserver: HTTPServer):
# 模拟服务B的 /data 接口返回JSON
httpserver.expect_request("/data").respond_with_json({"id": 1, "value": "mock_data"})
# 服务A调用模拟的服务B(地址指向Mock Server)
response = requests.get(httpserver.url_for("/data"))
# 断言服务A正确处理返回数据
assert response.json()["value"] == "mock_data"
优势:
•无需等待服务 B 开发完成•可模拟服务 B 返回错误码(如 500)测试服务 A 的容错逻辑
2. 场景:数据库自动化测试
问题:
测试数据写入数据库的逻辑时:
•真实数据库操作缓慢(尤其大数据量场景)•测试可能污染生产环境数据
Mock 方案:
用 unittest.mock
替换数据库连接对象,拦截 SQL 语句并验证参数。
案例代码:
from unittest.mock import MagicMock, patch
import sqlite3
def save_user(user_id, name):
conn = sqlite3.connect("prod.db") # 生产数据库(测试需避免操作)
cursor = conn.cursor()
cursor.execute("INSERT INTO users VALUES (?, ?)", (user_id, name))
conn.commit()
conn.close()
def test_save_user():
# 替换 sqlite3.connect 返回的游标和连接
mock_conn = MagicMock()
mock_cursor = MagicMock()
mock_conn.cursor.return_value = mock_cursor
with patch("sqlite3.connect", return_value=mock_conn):
save_user(1, "Alice")
# 验证是否执行了正确的SQL语句和参数
mock_cursor.execute.assert_called_once_with(
"INSERT INTO users VALUES (?, ?)", (1, "Alice")
)
mock_conn.commit.assert_called_once()
mock_conn.close.assert_called_once()
优势:
•测试速度提升 10 倍以上(无需真实 IO 操作)•完全避免数据库污染
二、性能测试中的 Mock 应用
1. 场景:系统瓶颈定位
问题:
当系统性能下降时,需确定是内部代码问题还是外部依赖(如数据库、第三方 API)导致的性能瓶颈。
Mock 方案:
•真实模式:测试包含真实外部依赖•Mock 模式:用 Mock 替代外部依赖,对比性能差异
案例(使用 Locust 进行压力测试):
from locust import HttpUser, task, between
from unittest.mock import patch
# 真实服务调用(可能较慢)
def real_external_api():
time.sleep(1) # 模拟耗时1秒的API调用
# Mock版本(快速返回)
def mock_external_api():
return "mock_response"
class MyUser(HttpUser):
wait_time = between(1, 3)
@task
def test_scenario(self):
# 切换真实/Mock模式
with patch("module.real_external_api", mock_external_api):
response = self.client.get("/my_endpoint")
assert response.status_code == 200
分析:
•若 Mock 模式下性能显著提升 → 瓶颈在外部依赖•若性能无变化 → 瓶颈在内部代码逻辑
2. 场景:高并发下的资源竞争测试
问题:
测试多线程/多进程环境下,共享资源(如文件、缓存)的竞争问题。
Mock 方案:
用 Mock 模拟资源访问延迟,触发竞争条件。
案例(模拟 Redis 并发访问):
from unittest.mock import MagicMock
import threading
class RedisCache:
def get(self, key):
# 真实Redis访问(测试时替换为Mock)
pass
def set(self, key, value):
pass
def test_concurrent_access():
mock_redis = MagicMock()
mock_redis.get.side_effect = lambda key: 0 # 初始值为0
mock_redis.set.side_effect = print # 打印设置操作
# 模拟10个线程并发增加计数器
def increment_counter():
current = mock_redis.get("counter")
mock_redis.set("counter", current + 1)
threads = [threading.Thread(target=increment_counter) for _ in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
# 验证最终结果是否符合预期(无锁情况下可能小于10)
assert mock_redis.set.call_count == 10
print("最终计数器值(模拟竞态条件):", mock_redis.get.call_args_list[-1])
输出结果:
最终计数器值(模拟竞态条件): call('counter')
设置操作次数: 10次(实际在无锁情况下,最终值可能为1)
结论:
•Mock 帮助暴露了并发安全问题•需引入锁机制或原子操作修复问题
三、Mock 在自动化与性能测试中的最佳实践
1. 自动化测试的 Mock 策略
场景 | Mock 对象 | 验证重点 |
HTTP 接口依赖 | 模拟服务端响应(状态码、延迟) | 请求参数、调用次数 |
数据库操作 | 替换游标返回预置数据 | SQL 语句正确性、事务提交 |
文件系统 | 模拟文件读写( | 文件内容、路径合法性 |
2. 性能测试的 Mock 策略
场景 | Mock 目标 | 性能指标 |
外部服务延迟 | 模拟高延迟(如 | 系统吞吐量、超时错误率 |
第三方 API 限流 | 返回 429 状态码 | 重试机制有效性 |
大数据量生成 | 生成虚拟数据(如 | 内存占用、处理时间 |
3. 工具推荐
•自动化测试:
•unittest.mock
(Python 内置)•pytest-mock
(更简洁的 API)•WireMock
(独立 Mock 服务,支持 HTTP 录制/回放)
•性能测试:
•Locust
+ Mock(模拟用户行为与依赖)•JMeter
的 MockSampler
(生成虚拟响应)
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】