JavaScript 中的持续集成:指南(ft. Github Actions)

2025-06-04

JavaScript 中的持续集成:指南(ft. Github Actions)

dev.to 的粉丝刚刚突破 5000 了!谢谢大家!真是个很棒的社区!还有谁也在 Twitter 上?快来联系我 =>我在这里

有没有办法在代码离开计算机后实现自动化测试?通过这份简单易读的指南,学习 JavaScript 中的持续集成。(包含 Github Actions!)

JavaScript 中的自动化测试和持续集成:你将学到什么

注意:即使你不喜欢 JavaScript,我也建议你阅读本指南,因为持续集成并不局限于任何特定的编程语言。你在这里学到的概念适用于任何其他语言或平台。

在本指南中您将了解:

  • 什么是自动化测试
  • 什么是持续集成
  • 如何将自动化单元测试和持续集成应用于简单的 JavaScript 项目

本指南的适用对象

如果您熟悉 JavaScript 测试,并希望学习持续集成,那么本指南非常适合您。如果您还是测试新手,请务必阅读Jest JavaScript 测试入门,然后再返回本指南。

本指南假设您熟悉版本控制、Git 及其相关术语,例如提交和推送。如果您是 Git 和版本控制新手,我建议您先阅读Git 手册的前几页,然后再回来阅读这篇文章。

享受!

什么是自动化测试?

测试代码至关重要,这一点我们都认同。如今,在本地工作站上进行测试就像在你最喜欢的IDE中按下按钮一样简单,但是当代码离开电脑后,你该如何强制执行测试呢?当新成员加入团队,而他/她还不是专家时,也很容易遗漏一些单元测试,毕竟我们也是人。

那又怎样?正如你所见,我们需要一个能够自动运行测试的工具

自动化测试指在大多数情况下不再是本地工作站的环境中,无需人工干预即可运行测试的能力。

自动化测试是借助所谓的持续集成服务中运行的特定工具来实现的。在了解这些工具之前,我们先来明确一下什么是持续集成。

什么是持续集成?

自软件和 Web 开发诞生以来,始终需要解决一些特定问题:

  • 在发布到生产环境之前进行测试
  • 在产品发货前发现错误
  • 获得有关产品的快速反馈

从早期开始,人们就曾尝试将所有这些步骤简化为所谓的“流水线”流水线由一组定义明确的“步骤”组成,这些步骤一个接一个地运行(或并行运行)。流水线如下所示:

文件更改-> 触发自动测试->发布到生产环境

随着时间的推移,所有这些技术都以持续集成的名义得到了“标准化” 。更广泛地说,持续集成是一种新代码和新功能持续集成到共享代码库中的实践。

理论上,如果所有开发人员每天多次将变更集成到同一个代码库中,团队就能快速获得反馈,调整错误并更快地修复 bug 。持续集成的基本前提是版本控制。每一行代码、每一行配置都应该处于版本控制之下。

说起来容易做起来难?持续集成并非易事,但如今有一些简洁的工具,只需几行代码就能创建流水线。那么,让我们来看看这些现代化的工具。

JavaScript 中的自动化测试和持续集成:选择 CI/CD 服务

持续集成(以下简称 CI)系统的核心是一条管道

流水线是特定操作后发生的一系列步骤我所说的操作是指代码库中的变更理想情况下,这些变更托管在版本控制服务器上。曾经有 SVN,但最终 Git 成为了最流行的版本控制系统。

一旦开发人员修改了某行代码,提交送到代码,流水线就会立即生效。接下来的操作取决于您如何配置CI 服务。作为流水线的一部分,您可以:

  • 测试你的代码/软件/UI
  • 构建生产版本并部署

但CI 服务究竟是什么?它是一种运行流水线的工具。您可以将其安装在服务器上(本地),也可以从外部提供商处租用(即服务)。如今有很多 CI 服务,有免费的,也有付费的:我可以列举TravisCICircleCIGitLab CI。您可以选择自己喜欢的!

如今,您可能也想摆脱使用 FTP 进行“部署”的困扰。大多数 CI 服务都配备了某种CD 功能,即持续交付 (Continuous Delivery)的缩写。因此,我们将这些工具称为“CI/CD 服务”。

持续交付意味着测试通过后立即发布软件。持续交付类似于持续集成:自动化测试通过后,我们可以构建生产工件,然后自动部署到生产环境中。

手紧一点,在接下来的部分中,您最终将对 CI 进行一些练习。

JavaScript 中的自动测试和持续集成:配置 CI/CD 服务、工作流程

让我们回顾一下到目前为止所学的内容。持续集成是一种实践。其核心原则规定,所有内容都必须处于版本控制之下,并且开发人员必须每天将代码集成到共享代码库中。

如今,持续集成已在 CI/CD 服务上得到实践,您可以在其中创建所谓的管道,该管道在开发人员每次进行更改时都会触发。

流水线负责构建代码并针对其运行自动化测试。但是CI/CD 服务在实践中如何工作呢?大多数情况下,你应该使用配置文件来配置服务

在撰写本指南时,我获得了Github Actions的 Beta 访问权限,这是 Github 的一项新功能,它还包含一项CI/CD 服务(公共仓库免费)。Actions 直接与 Github 仓库集成,这是一种无需依赖 Github 以外的外部服务即可实践 CI 的好方法。

大多数 CI/CD 服务都是通过YAML 文件配置的,通常需要:

  • 管道的名称(Github 称之为“工作流”)
  • 待办事项清单
  • 每项工作的步骤列表

如果我们想将配置转化为实际要做的事情,我们可以配置 CI 服务:

  • 设置 JavaScript 环境(主要是 Node.js)
  • 安装项目的依赖项
  • 可选地构建项目
  • 运行自动化测试

在下一节中,我们将配置一个 Github 工作流来自动化几个单元测试。在进入下一节之前,请花点时间了解一下GitHub Actions 的工作流语法,熟悉一下。

JavaScript 中的自动化测试和持续集成:自动化单元测试

在《Jest 入门:JavaScript 测试》,我介绍了测试的基础知识,并为读者提供了一个简单的 JavaScript 项目。它包含一组针对名为 filterByTerm 的函数的单元测试。

现在让我们克隆 repo 以使用 Github 工作流添加测试管道:

git clone git@github.com:valentinogagliardi/getting-started-with-jest.git
Enter fullscreen mode Exit fullscreen mode

移至项目文件夹内,安装依赖项并运行快速测试:

cd getting-started-with-jest
npm i
npm test
Enter fullscreen mode Exit fullscreen mode

这些正是我们要自动化的步骤。请注意,第一个测试应该始终在本地工作站上进行,切勿提交失败的代码。在推送到仓库之前,测试代码是您的责任。现在,仍然在仓库中创建一个名为.github/workflows/ 的新文件夹

mkdir -p .github/workflows/
Enter fullscreen mode Exit fullscreen mode

Github 期望在该文件夹中找到你的工作流程(管道)。现在我们需要一个YAML 格式的工作流程配置文件。在.github/workflows/ 目录中创建一个名为javascript.yml的新文件。

我不会逐行逐行地讲解,配置应该很容易理解。按照我们之前概述的步骤:

  • 设置 JavaScript 环境(主要是 Node.js)
  • 安装项目的依赖项
  • 可选地构建项目
  • 运行自动化测试

我们可以像这样配置我们的第一个工作流程:

name: JavaScript workflow

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js 12.x
      uses: actions/setup-node@v1
      with:
        node-version: "12.x"
    - name: npm install, and test
      run: |
        npm install
        npm test
      env:
        CI: true
Enter fullscreen mode Exit fullscreen mode

该工作流程有一个名为“JavaScript 工作流程”,在每次推送时运行,因此它会创建一个带有 Node.js 12.x 的虚拟 Ubuntu 环境(参见上面的步骤)。

不要让我们提交,请注意工作流文件应该推送到 repo:

git add .github/
git commit -m  "Configuring a Github workflow"
git push origin HEAD
Enter fullscreen mode Exit fullscreen mode

现在工作流程应该可以运行了,我可以通过转到Github 上的“操作”选项卡来确认它运行顺利:

Github 工作流测试通过

测试通过!信不信由你,在 Github 的帮助下,这已经是 JavaScript自动化测试和持续集成的入门步骤了。

当然,现实世界的项目会有不同的需求,并使用更复杂的工作流配置。但我的观点是,有了我们今天拥有的工具,就没有理由不去实践持续集成和自动化测试了

我建议阅读 Github 上的文档来了解工作流程所提供的功能。

结论和下一步

持续集成最初于 1991 年被提出,后来被世界各地越来越多的团队和软件开发人员所采用。

持续集成不仅仅是一种实践,更是一门学科。它需要你彻底改变软件和 Web 开发的方法。然而,采用 CI/CD 的牺牲也带来了诸多好处。

持续集成建立在以下核心原则之上:

  • 代码和配置必须处于版本控制之下
  • 一切都应该自动可测试
  • 如果测试失败,我们必须停止并修复错误

如今,越来越多的 CI/CD 服务(如 Gitlab CI、Bitbucket 管道、CircleCI 和 Github 工作流)使持续集成变得非常简单。

但是持续集成真的值得吗?考虑到如今构建/测试流水线的搭建如此简单,即使项目生命周期较短,我们也应该没有理由逃避 CI/CD。

那么接下来该怎么做呢?通过这个简单的例子了解了自动化单元测试之后,尝试在 Github 工作流中(或者使用你选择的工具)自动化一些 UI 测试。你的 YAML 文件应该采取哪些步骤?对于 UI 测试,我强烈推荐使用Cypress,你会觉得很有乐趣。

感谢您的阅读,敬请期待!

文章来源:https://dev.to/valentinogagliardi/continuous-integration-in-javascript-a-guide-ft-github-actions-237j
PREV
这 8 个播客将帮助您增加知识并拓展您的思维。
NEXT
27 Web Development Terms You Should Absolutely Know About 2 An API is not a toolkit, just a collection of methods to access an application. 6 Web API can also refer to APIs available through web (i.e. HTTP) and I have a feeling that this meaning is more common. 7 ECMAScript is not an official or alternative name for JavaScript but a standard. JavaScript is only one of the implementations of this standard, even if there are no other notable implementations left. 12 Is node.js used on client side at all? 14 I wouldn't treat web server and web service terms the same. Web servers are typically serving web pages for humans, web services are typically providing services for other services or applications through web. Any service is typically for machine use. 16 JSON can be used in any data interchange, is not limited to web applications or web in general. 17 REST API is definitely not limited to exposing data, it is widely used to execute commands and create data too. Although in many cases there is a database in the background it is not correct to state that a REST API is for interacting with a database. 18 Your definition is a very limiting subset of what a transpiler is: a tool what transforms source code to source code in another programming language (translating compiler). A typical example is TypeScript compiler (tsc) what takes TS source code as input and outputs javascript source code, despite being called compiler. The input and output languages and versions are irrelevant, in fact many transpilers can consume and produce different versions of the same language. 19 RFC is a must mention term. 21 Like others mentioned it should be pointed out that vanilla means light, basic in programming terms. 22 XHR is a must mention here. 24 Isn't really the browser what gives permission but the web server and the browser blocks or restricts access based on permissions acquired from the server. 25 Since websocket support has become almost omnipresent it is used in any scenario where server side notifications have to be sent to clients (push notifications) because polling is rather expensive. I.e. Gmail and other web email clients use websocket despite not doing chat or real time. 26 With the rise of Web SQL SQL is no longer a server side language. NoSQL is a must mention on this topic, especially since we have IndexedDB in browsers. 27 GraphQL is a query language but is nothing like SQL. It is in fact somewhat similar to NoSQL what itself is very different to SQL.