”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Playwright-Network-Cache 增强您的 ETests

使用 Playwright-Network-Cache 增强您的 ETests

发布于2024-11-07
浏览:794

Supercharge Your ETests with Playwright-Network-Cache

简介

当使用像 Playwright 这样的端到端测试框架时,处理网络请求通常是一项复杂的任务。依赖外部 API 的测试可能会很慢且不一致,从而引入不必要的不​​稳定。由于服务器缓慢或不可靠,在一次测试运行中成功的网络调用可能在下一次测试运行中失败,从而导致结果不一致。为了解决这个问题,开发人员经常诉诸模拟网络请求,这带来了另一个挑战:管理模拟。

如果有一种自动化的方式来处理缓存和重用网络响应而不需要设置复杂的模拟策略,这不是很棒吗?我研究了现有的方法并开发了一个我想介绍的工具。它通过在文件系统上缓存网络请求来解决这些具体问题,从而实现更快、更可靠的 Playwright 测试。

测试中网络请求的问题

网络请求通常是测试执行中最慢的部分。运行多个测试套件时,重复查询外部 API 会显着增加测试持续时间。此外,现实世界的 API 可能不稳定,偶尔会超时,使您的测试脆弱且不可靠。

缓解这种情况的常见方法是模拟 API 响应。虽然有用,但模拟需要手动干预 - 您需要仔细构建模拟响应,不断更新它们,并确保处理每个潜在的网络场景。随着 API 的发展或测试用例的变化,这可能会成为巨大的维护负担。 Playwright 支持 HAR 文件来捕获和重放网络流量,但使用 HAR 可能很乏味,并且缺乏动态修改响应的灵活性。

输入剧作家网络缓存

playwright-network-cache 旨在简化 Playwright 测试中缓存网络响应的过程,消除对手动模拟或严格的 HAR 文件的需要。有了这个库,网络响应在第一次测试运行期间会自动存储在文件系统上,并且可以在后续运行中重用,从而显着加快测试执行速度。此外,响应保存在清晰、有组织的文件夹结构中,以便根据需要轻松检查和修改它们。

它如何解决问题

  1. 自动缓存:第一次运行测试时,库会自动缓存网络响应。这意味着您的测试在将来的运行中不必等待外部 API 响应 - 将使用缓存的数据,从而实现更快、更可靠的测试。

  2. 动态修改:需要调整特定测试用例的响应? playwright-network-cache 允许您动态修改缓存的响应。无论您想要更改状态代码、标头还是响应正文,该库都提供了即时调整缓存数据的选项,而无需手动维护单独的模拟。

  3. 灵活的结构:缓存系统根据主机名、请求方法和 URL 路径组织文件,确保您可以轻松浏览和管理缓存数据。对于更复杂的情况,您甚至可以按请求查询参数、请求正文或其他自定义字段拆分缓存文件,确保数据存储和重用方式的完全灵活性。

  4. 速度提升:通过重用缓存的响应,您的测试不再需要等待网络调用完成,从而使测试速度显着加快。当使用大型测试套件或在速度至关重要的 CI 环境中运行测试时,这特别有用。

  5. 不再有模拟地狱:忘记手动维护模拟。该库会为您处理一切 - 从缓存到重放,甚至修改响应。您不再需要为每个测试场景手动制作模拟响应,并且可以更多地关注测试逻辑。

  6. 无 HAR 复杂性:HAR 文件对于记录和重放网络交互非常有用,但它们很快就会变得很麻烦,尤其是当您需要修改响应时。 playwright-network-cache 提供了一种更干净、更灵活的 HAR 替代方案,让您可以将各个响应作为简单的 JSON 文件进行管理。

例子

假设您正在测试一个从 API 获取猫列表的应用程序。如果没有缓存,每次测试运行都需要向 API 发出实时请求,从而为您的测试增加延迟和潜在的故障点。

使用 playwright-network-cache,您可以轻松缓存 API 响应:

test('test', async ({ page, cacheRoute }) => {
  await cacheRoute.GET('https://example.com/api/cats');
  // Perform usual test actions...
});

第一次运行时,响应被缓存在 .network-cache 目录中,其结构如下:

.network-cache
└── example.com
    └── api-cats
        └── GET
            ├── headers.json
            └── body.json

在后续运行中,缓存的响应将被重用,从而使测试速度更快,并且无需访问实际的 API。

您可以根据特定测试需求修改缓存的响应:

test('test', async ({ page, cacheRoute }) => {
  await cacheRoute.GET('https://example.com/api/cats', {
    modify: async (route, response) => {
      const json = await response.json();
      json[0].name = 'Kitty-1';
      await route.fulfill({ json });
    }
  });
  // Perform usual test actions...
});

要在测试中获取可用的 cacheRoute 变量,请像任何其他 Playwright 固定装置一样实例化它:

// fixtures.js
import { test as base } from '@playwright/test';
import { CacheRoute } from 'playwright-network-cache';

export const test = base.extend({
  cacheRoute: async ({ page }, use) => {
    const cacheRoute = new CacheRoute(page, { /* cache options */ });
    await use(cacheRoute);
  },
});

库文档中还有许多其他示例和用例。

不仅仅是缓存

playwright-network-cache 不仅仅是缓存。它提供高级功能,例如:

  • 修改响应:使用自定义函数动态调整缓存响应中的数据。
  • 处理状态代码:根据特定的 HTTP 状态代码缓存响应,包括错误。
  • 灵活的目录结构:自定义缓存文件的存储方式和位置,允许您根据需要定制缓存策略。
  • 禁用或更新缓存:暂时禁用特定测试的缓存或在需要时强制更新缓存。

利用这些强大的功能,您可以精细地控制测试中网络请求的管理方式。

回顾

如果您希望让 Playwright 测试更快、更可靠,请尝试 playwright-network-cache。通过在文件系统上缓存网络响应并允许动态修改,它消除了手动模拟的需要,并为 HAR 文件提供了灵活、易于使用的替代方案。

感谢您的阅读❤️

版本声明 本文转载于:https://dev.to/vitalets/supercharge-your-e2e-tests-with-playwright-network-cache-58jm?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Node.js 中的新增功能
    Node.js 中的新增功能
    TL;DR: 让我们探索 Node.js 22 的主要功能,包括 ECMAScript 模块支持和 V8 引擎更新。此版本引入了 Maglev 编译器和内置 WebSocket 客户端,以增强性能和实时通信。还涵盖了测试、调试和文件系统管理方面的改进。 Node.js 22 将于 10 月进入 LT...
    编程 发布于2024-11-07
  • 了解 MongoDB 的distinct() 操作:实用指南
    了解 MongoDB 的distinct() 操作:实用指南
    MongoDB 的distinct() 操作是一个强大的工具,用于从集合中的指定字段检索唯一值。本指南将帮助您了解distinct() 的用途、使用它的原因和时间,以及如何在 MongoDB 查询中有效地实现它。 什么是distinct()? distinct() 方法返回集合或集合...
    编程 发布于2024-11-07
  • 为什么 JavaScript 中的“0”在比较中为 False,而在“if”语句中为 True?
    为什么 JavaScript 中的“0”在比较中为 False,而在“if”语句中为 True?
    揭开 JavaScript 的悖论:为什么“0”在比较中为假,但在 If 语句中为假在 JavaScript 中,原语 " 的行为0”给开发者带来了困惑。虽然诸如“==”之类的逻辑运算符将“0”等同于假,但“0”在“if”条件下表现为真。比较悖论代码下面演示了比较悖论:"0&qu...
    编程 发布于2024-11-07
  • GitHub Copilot 有其怪癖
    GitHub Copilot 有其怪癖
    过去 4 个月我一直在将 GitHub Copilot 与我们的生产代码库一起使用,以下是我的一些想法: 好的: 解释复杂代码:它非常适合分解棘手的代码片段或业务逻辑并正确解释它们。 单元测试:非常擅长编写单元测试并快速生成多个基于场景的测试用例。 代码片段:它可以轻松地为通用用例生成有用的代码片段...
    编程 发布于2024-11-07
  • 静态类或实例化类:什么时候应该选择哪个?
    静态类或实例化类:什么时候应该选择哪个?
    在静态类和实例化类之间做出选择:概述在 PHP 中设计软件应用程序时,开发人员经常面临在使用静态类或实例化对象。这个决定可能会对程序的结构、性能和可测试性产生重大影响。何时使用静态类静态类适用于对象不具备静态类的场景独特的数据,只需要访问共享功能。例如,用于将 BB 代码转换为 HTML 的实用程序...
    编程 发布于2024-11-07
  • ⚠️ 在 JavaScript 中使用 `var` 的隐藏危险:为什么是时候继续前进了
    ⚠️ 在 JavaScript 中使用 `var` 的隐藏危险:为什么是时候继续前进了
    关键字 var 多年来一直是 JavaScript 中声明变量的默认方式。但是,它有一些怪癖和陷阱,可能会导致代码出现意外行为。现代替代方案(如 let 和 const)解决了许多此类问题,使它们成为大多数情况下声明变量的首选。 1️⃣ 提升:var 在不知不觉中声明变量! ?解释:...
    编程 发布于2024-11-07
  • PDO::MYSQL_ATTR_INIT_COMMAND 需要“SET CHARACTER SET utf8”吗?
    PDO::MYSQL_ATTR_INIT_COMMAND 需要“SET CHARACTER SET utf8”吗?
    在带有“PDO::MYSQL_ATTR_INIT_COMMAND”的 PDO 中“SET CHARACTER SET utf8”是否必要?在 PHP 和 MySQL 中,“SET NAMES” utf8”和“SET CHARACTER SET utf8”通常在使用 UTF-8 编码时使用。但是,当使...
    编程 发布于2024-11-07
  • 为什么使用Password_Hash函数时哈希值会变化?
    为什么使用Password_Hash函数时哈希值会变化?
    了解Password_Hash函数中不同的哈希值在开发安全认证系统时,开发人员经常会遇到使用password_hash获取不同密码哈希值的困惑功能。为了阐明此行为并确保正确的密码验证,让我们分析此函数背后的机制。密码加盐:有意的功能password_hash 函数有意生成唯一的盐它对每个密码进行哈希...
    编程 发布于2024-11-07
  • 为什么与谷歌竞争并不疯狂
    为什么与谷歌竞争并不疯狂
    大家好,我是 Antonio,Litlyx 的首席执行官,我们的对手是一些巨头! Microsoft Clarity、Google Analytics、MixPanel...它们是分析领域的重要参与者。当人们听说一家初创公司正在与如此知名的公司合作时,他们常常会感到惊讶。但让我们看看为什么与谷歌这样...
    编程 发布于2024-11-07
  • 如何在 Java Streams 中高效地将对象列表转换为可选对象?
    如何在 Java Streams 中高效地将对象列表转换为可选对象?
    使用 Java 8 的可选和 Stream::flatMap 变得简洁使用 Java 8 流时,将 List 转换为可选 并有效地提取第一个 Other 值可能是一个挑战。虽然 flatMap 通常需要返回流,但可选的 Stream() 的缺失使问题变得复杂。Java 16 解决方案Java 16 ...
    编程 发布于2024-11-07
  • 避免前端开发失败:编写干净代码的行之有效的实践
    避免前端开发失败:编写干净代码的行之有效的实践
    介绍 您是否曾因看似无法理清或扩展的凌乱代码而感到不知所措?如果你有,那么你并不孤单。许多开发人员面临着维护干净的代码库的挑战,这对于项目的长期成功和可扩展性至关重要。让我们探索一些有效的策略来保持代码可管理性和项目顺利运行。 了解基础知识:什么是干净代码? 干净的...
    编程 发布于2024-11-07
  • 如何访问Python字典中的第一个和第N个键值对?
    如何访问Python字典中的第一个和第N个键值对?
    获取 Python 字典中的第一个条目使用数字索引(如颜色[0])对字典进行索引可能会导致 KeyError 异常。从 Python 3.7 开始,字典保留插入顺序,使我们能够像有序集合一样使用它们。获取第一个键和值要获取字典中的第一个键和值,我们可以使用以下方法:列表转换:使用 list(dict...
    编程 发布于2024-11-07
  • 使用 cProfile 和 PyPy 模块优化 Python 代码:完整指南
    使用 cProfile 和 PyPy 模块优化 Python 代码:完整指南
    介绍 作为 Python 开发人员,我们通常先关注让代码正常运行,然后再担心优化它。然而,在处理大规模应用程序或性能关键型代码时,优化变得至关重要。在这篇文章中,我们将介绍两个可用于优化 Python 代码的强大工具:cProfile 模块和 PyPy 解释器。 在这篇文章的结尾,...
    编程 发布于2024-11-07
  • 上周我学到了什么(
    上周我学到了什么(
    原生 JavaScript 中的反应性 – 使用代理模式在应用程序状态更改时触发事件。 (前端大师课程 - “你可能不需要框架”) throw new Error("Error!") 不能在三元中使用(至少不能用作 'else' 部分。三元运算符的最后一部分...
    编程 发布于2024-11-07
  • 如何在 Linux 系统上将 Java 应用程序作为服务运行?
    如何在 Linux 系统上将 Java 应用程序作为服务运行?
    Linux 系统服务导航:将 Java 应用程序作为服务运行在 Linux 系统管理领域,将应用程序作为服务进行管理对于确保其可靠且受控的执行至关重要。本文深入探讨了将 Java 服务器应用程序配置为在 Linux 操作系统上作为服务运行的过程,为用户提出的问题提供了全面的解决方案。主要目标是创建一...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3