Mocking 是 route 方法最重要的应用之一,用于在测试中模拟后端 API 响应,实现测试与真实后端服务的解耦。
基本响应模拟
from playwright.sync_api import sync_playwrightdef test_basic_mock():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()# 模拟用户列表 APIdef mock_users(route):route.fulfill(status=200,content_type="application/json",body='{"users": [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]}')page.route("**/api/users", mock_users)page.goto("http://localhost:3000")# 此时页面调用 /api/users 将返回模拟数据browser.close()
基于请求参数的动态响应
def dynamic_mock_based_on_request(route):request = route.request# 根据查询参数返回不同数据if "user_id=1" in request.url:route.fulfill(status=200,body='{"id": 1, "name": "管理员", "role": "admin"}')elif "user_id=2" in request.url:route.fulfill(status=200,body='{"id": 2, "name": "普通用户", "role": "user"}')else:route.fulfill(status=404, body='{"error": "用户不存在"}')page.route("**/api/user**", dynamic_mock_based_on_request)
基于请求体的动态响应
def mock_based_on_post_data(route):request = route.requestif request.method == "POST" and request.post_data:post_data = request.post_dataif "login" in request.url:# 解析登录数据if "admin" in post_data:route.fulfill(status=200,body='{"token": "admin-token", "user": {"role": "admin"}}')else:route.fulfill(status=200,body='{"token": "user-token", "user": {"role": "user"}}')else:route.continue_()else:route.continue_()page.route("**/api/**", mock_based_on_post_data)
完整的 CRUD 操作模拟
class UserServiceMock:def __init__(self):self.users = [{"id": 1, "name": "张三", "email": "zhang@example.com"},{"id": 2, "name": "李四", "email": "li@example.com"}]self.next_id = 3def handle_user_routes(self, route):request = route.requestif request.method == "GET":self.handle_get(route)elif request.method == "POST":self.handle_post(route)elif request.method == "PUT":self.handle_put(route)elif request.method == "DELETE":self.handle_delete(route)def handle_get(self, route):if route.request.url.endswith("/api/users"):# 获取用户列表route.fulfill(status=200,body=json.dumps({"users": self.users}))else:# 获取单个用户user_id = int(route.request.url.split("/")[-1])user = next((u for u in self.users if u["id"] == user_id), None)if user:route.fulfill(status=200, body=json.dumps(user))else:route.fulfill(status=404, body='{"error": "用户不存在"}')def handle_post(self, route):# 创建用户post_data = json.loads(route.request.post_data)new_user = {"id": self.next_id,"name": post_data["name"],"email": post_data["email"]}self.users.append(new_user)self.next_id += 1route.fulfill(status=201, body=json.dumps(new_user))def handle_put(self, route):# 更新用户user_id = int(route.request.url.split("/")[-1])user_data = json.loads(route.request.post_data)for user in self.users:if user["id"] == user_id:user.update(user_data)route.fulfill(status=200, body=json.dumps(user))returnroute.fulfill(status=404, body='{"error": "用户不存在"}')def handle_delete(self, route):# 删除用户user_id = int(route.request.url.split("/")[-1])self.users = [u for u in self.users if u["id"] != user_id]route.fulfill(status=204)# 使用模拟服务user_mock = UserServiceMock()page.route("**/api/users**", user_mock.handle_user_routes)
未完待续,下篇我们将带领大家继续学习错误场景模拟、高级 Mocking 技巧、测试用例中的最佳实践以及调试和验证等内容~
链接:
https://juejin.cn/post/7569960869959073838
本文为51Testing经授权转载,转载文章所包含的文字来源于作者。如因内容或版权等问题,请联系51Testing进行删除

