测试时跳过 Webpack

发布于 作者

Skip Webpack when Testing image

让我们聊聊如何在 CI 管道中摆脱 NodeJS。

我运行 Chipper CI(Laravel 的持续集成)。我一直都很困扰,Webpack 构建比 CI 管道的实际 *有价值* 部分花费更多时间并导致更多问题。

我们大多数人只需要运行我们的测试,也许还要启动部署。Node 构建任务会增加很多时间,并需要更多 CPU/RAM 使用量。

如果我们不需要 Node 在我们的管道中呢?我们可以… 不用吗?

答案是:当然可以,也许吧!

功能测试

很多时候,在 CI 管道中构建静态资产的唯一原因是生成 mix-manifest.json 文件。

这使得 mix() 助手在运行 Laravel **功能** 测试时可以正常工作。功能测试对您的应用程序进行 HTTP 调用,因此通常会渲染使用 mix() 助手的 Blade 模板。

如果您没有清单文件,就会抛出错误!

生成此清单文件涉及构建您的静态资产 - 换句话说,使用 npm(或 yarn)安装依赖项并运行 Webpack 任务

# Build static assets
 
npm ci --no-audit
npm run dev

旁注:您几乎肯定应该提交您的 package-lock.json 文件并运行 npm ci --no-audit 而不是 npm install

如果您查看您的 public/mix-manifest.json 文件,它可能看起来像这样(无论是否包含哈希,取决于您是否启用了版本控制)

{
"/js/app.js": "/js/app.js",
"/js/foo.js": "/js/foo.js",
"/css/app.css": "/css/app.css"
}

关键是:您不需要此文件存在才能进行测试!

在您的测试的 setUp() 方法中,您可以添加以下魔法

protected function setUp(): void
{
parent::setUp();
 
$this->withoutMix();
}

有了它,mix() 助手就不会因缺少清单文件而返回任何错误。您的测试可以在不运行 NodeJS 任务的情况下通过!

您还可以为您的 CI 管道创建一个清单文件,并在测试时复制它。

假设我们的 Mix 配置生成上述 mix-manifest.json 文件。我们可以将一个虚拟清单文件提交到 tests/mix-manifest.json,它将始终可用!

然后,在我们的 CI 管道脚本中,我们可以使用该文件而不是安装/构建我们的 Node 依赖项

# What if we created a mix-manifest.json file just for testing?
# During CI, we can just move it where it needs to go
cp tests/mix-manifest.json public/mix-manifest.json
 
# And then run your tests, no NodeJS required!
php artisan test

有了此文件,mix() 助手将正常工作,您的功能测试将不会出现任何问题!

这(或任何方法!)创建一个正确的清单文件可以帮助您在 CI 构建管道中节省大量时间和服务器资源。

您需要在您以添加文件到真实清单文件的方式更改配置时更新您的 tests/mix-manifest.json 文件。

什么时候需要构建资产?

有时,您 *确实* 需要在 CI 管道中构建资产!以下是您最常需要构建资产的时间

  1. 当您构建生产资产以将它们捆绑到一个“工件”(zip 文件、容器镜像等)中,以便您可以部署它
  2. 当您在测试套件中运行其他 node 命令时,例如 eslint
  3. 当您使用 Laravel Dusk 进行浏览器测试时

如果我需要构建资产怎么办?

即使您需要在 CI 脚本中构建静态资产,您仍然可以节省宝贵的时间!

我最喜欢的用于此的包是 Airdrop(由 Aaron Francis 创建)。它可以帮助您 *仅在* 提交之间发生更改时构建静态资产。如果没有变化,您可以从 S3 等文件系统驱动程序下载它们。

Chris Fidao photo

CloudCastsServers for Hackers 教授编码和服务器。 Chipper CI 的联合创始人。

分类于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,不错过任何新技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,来自“绝不妥协”播客的两位经验丰富的开发者,现在可以为您的 Laravel 项目雇用。 ⬧ 固定费用 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

以每月仅 2500 美元的价格为您的项目配备一位经验丰富的 Laravel 开发人员,拥有 4-6 年的经验。获得 160 小时的专业知识和 15 天的无风险试用期。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想之选,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,它包含运行现代 SaaS 所需的所有功能。付款、漂亮的结帐、管理面板、用户仪表板、身份验证、准备好的组件、统计、博客、文档等等。

SaaSykit:Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,助力公司取得成功

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 灵活的现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包在您的 Laravel 应用程序中添加评论

阅读文章