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

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

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

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]删除
最新教程 更多>
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-10
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-07-10
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-07-10
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-07-10
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-10
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-07-10
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-10
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-07-10
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-07-10
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date oped filtering > = p...
    编程 发布于2025-07-10
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-07-10
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    无法连接到mySQL数据库:故障排除错误消息要调试问题,建议将以下代码添加到文件的末尾.//config/database.php并查看输出: ... ... 回声'... echo '<pre>'; print_r($db['default']); echo '</pr...
    编程 发布于2025-07-10
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-10
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-07-10
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-07-10

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

Copyright© 2022 湘ICP备2022001581号-3