Title text reads Testing JavaScript with Jest on Vultr. The yellow background contains an icon depicting jest in the top right corner and the letters JS in the bottom left corner.

在 Vultr 上使用 Jest 测试 JavaScript

作者头像Vultr阅读时间:7 分钟

Jest 是一款流行的 JavaScript 测试框架,用于测试 React 和 JavaScript 代码库。它提供了一套全面的匹配器来进行断言,允许用户为许多不同类型的项目编写测试。Jest 将测试组织成测试套件;这种结构化方法提高了可维护性和可读性,从而实现了更高效的测试工作流程。

在本文中,我们将探讨软件开发中常用的各种测试类型,并分享一些测试的良好实践和约定。我们将编写 JavaScript 函数并使用 Jest 测试框架在 Vultr 服务器上(使用 NodeJS 市场应用程序)对其进行测试。

测试类型

为了确保代码质量和功能,开发通常涉及三种类型的测试。每种类型都具有特定的用途

  • 单元测试:这些测试侧重于测试单个单元或组件,例如函数、方法或类。这种类型的测试确保每个代码组件本身都能正确运行。
  • 集成测试:这些测试侧重于评估应用程序的不同组件是否按预期相互交互。与测试单个组件的单元测试不同,这些测试涉及多个单元之间的交互,以确保它们组合在一起时能够按预期运行。
  • 端到端测试:这些测试通过测试应用程序从开始到结束的流程来模拟真实的用户场景。这些测试通常是自动化的,并且像真实用户一样与应用程序交互,确保应用程序在现实世界中按预期工作。

测试约定

Arrange-Act-Assert (AAA) 模式是一种常用的约定,用于组织和构建单元测试用例。

要了解每个部分,以下是一个示例,其中我们希望测试用户电子邮件是否为字母数字(字母和数字)并使用 example.com 域名

javascript
test("returns false for an invalid domain", () => {
  const email = "user123@example.net";
  const result = isValidEmail(email);
  expect(result).toBe(false);
});
  • Arrange(准备):在此阶段,您设置初始条件并准备测试环境。这包括初始化对象、设置输入和配置环境以创建您想要测试的场景。在上面的示例中,我们希望测试 isValidEmail 函数是否正确识别无效电子邮件。我们已使用不符合我们电子邮件标准的字符串初始化 email 变量,因为它使用 .net 顶级域名而不是 .com
  • Act(执行):在此阶段,您执行要测试的操作或行为。这可能包括调用方法、与对象交互或执行特定的代码段。在上面的示例中,此步骤涉及调用 isValidEmail 函数并将其作为参数传递 email 变量。
  • Assert(断言):最后,在此阶段,您验证“执行”阶段的结果是否符合您的预期。在上面的示例中,我们使用了 Jest 框架提供的 expect 函数来确认 isValidEmail 函数返回的 result 正确地识别为 false,正如无效电子邮件所预期的那样。

在 Vultr 上设置项目目录

首先,请按照我们上一篇文章中“在 Vultr 上部署 Node.js 应用程序”部分中的步骤部署服务器。确保在“市场应用程序”选项卡中选择NodeJS。接下来,让我们继续设置 Node.js 项目并安装 Jest 框架。然后,我们将分别在 JavaScript 文件中定义两个函数,并在后续部分中对其进行测试。

  1. 使用以下命令验证 Node.js 安装
    bash
    node --version
    
  2. 创建一个项目目录,并导航到该目录。
    bash
    mkdir sample
    cd sample
    
  3. 初始化一个 Node.js 项目。
    bash
    npm init -y
    
  4. 安装 Jest 测试框架。
    bash
    npm install --save-dev jest
    
    --save-dev 标志用于指定将软件包安装为开发依赖项。这意味着它仅在开发和测试阶段使用,而不是在生产中使用。
  5. 打开 package.json 文件。我们使用的是 Nano 文本编辑器。查看 快捷键备忘单 以获取有关使用 Nano 的帮助。
    bash
    nano package.json
    
  6. 添加测试脚本。
    json
    "scripts": {
      "test": "jest"
    }
    
  7. 保存并退出文件(Ctrl + X 关闭文件,出现提示时按 Y 保存更改)。
  8. 创建一个 JavaScript 文件。
    bash
    nano token.js
    
  9. 将下面的代码复制并粘贴到 token.js 文件中。此代码演示了如何计算 JSON Web Token (JWT) 的过期日期以及如何检查它是否已过期。

    注意:此处显示的手写过期检查纯粹是为了说明目的。在处理现实世界项目中的身份验证令牌时,强烈建议依赖成熟的库,例如 jsonwebtoken

    javascript
    /**
     *
     * @param {string} token
     * @returns {Date}
     */
    
    function getTokenExpiryDate(token) {
      if (!token) return null;
    
      const tokenParts = token.split(".");
      const payload = tokenParts[1];
      const decodedPayload = Buffer.from(payload, "base64").toString();
      const payloadObject = JSON.parse(decodedPayload);
      const expiryDate = new Date(payloadObject.exp * 1000);
    
      return expiryDate;
    }
    
    /**
     *
     * @param {string} token
     * @returns {boolean}
     */
    
    function isTokenExpired(token) {
      const expiryDate = getTokenExpiryDate(token);
      const currentDate = new Date();
    
      return currentDate > expiryDate;
    }
    
    module.exports = { isTokenExpired };
    
    上面的代码定义了两个函数,getTokenExpiryDateisTokenExpired,它们计算提供的 JWT 令牌的过期日期,并根据令牌的过期状态返回 truefalse
  10. 保存并退出文件。
  11. 创建另一个 JavaScript 文件。
    bash
    nano email.js
    
  12. 将以下代码复制并粘贴到文件中
    javascript
    function isValidEmail(email) {
      const emailRegex = /[a-zA-Z0-9]+@example\.com/;
      return emailRegex.test(email);
    }
    
    module.exports = { isValidEmail };
    
    上面的代码定义了一个 isValidEmail 函数,该函数使用正则表达式验证提供的电子邮件的结构。正则表达式允许我们验证所有电子邮件是否都是字母数字,并且以 @example.com 结尾。
  13. 保存并退出文件。

使用 Jest 编写单元测试

在本节中,您将学习如何通过使用 Jest 框架为前面定义的 JavaScript 函数编写单元测试。我们将把这些测试放在同一项目内的单独目录中。我们建议您遵循此处演示的文件命名约定,因为 Jest 会自动将以 .test.js 结尾的文件视为测试文件。

  1. sample 目录中,创建另一个名为 tests 的目录并导航到该目录。
    bash
    mkdir tests
    cd tests
    
  2. 创建一个 JavaScript 测试文件。
    bash
    nano token.test.js
    
  3. 将以下代码复制并粘贴到文件中
    javascript
    const { isTokenExpired } = require("/root/sample/token.js");
    
    describe("isTokenExpired", () => {
      test("should return false if the token is not expired", () => {
        const token = "eyJ0eXAiOiJKV1QiLCJhbGciOi...";
        const result = isTokenExpired(token);
        expect(result).toBe(false);
      });
    
      test("should return true if the token is expired", () => {
        const token = "eyJ0eXAiOiJKV1QiLCJhbGciOi...";
        const result = isTokenExpired(token);
        expect(result).toBe(true);
      });
    });
    
    上面的代码使用前面定义的 isTokenExpired 函数来确定该函数是否按预期工作,根据 JWT 是否过期返回正确的布尔值。

    注意:如果希望 isTokenExpired 函数检查真实令牌,则可以使用 JSON Web Token Builder 生成过期和未过期的 JWT,并将其用于上面的占位符。

  4. 保存并退出文件。
  5. 创建另一个 JavaScript 测试文件。
    bash
    nano email.test.js
    
  6. 将以下代码复制并粘贴到文件中
    javascript
    const { isValidEmail } = require("/root/sample/email.js");
    
    describe("isValidEmail", () => {
      test("returns true for a valid email", () => {
        const email = "user123@example.com";
        const result = isValidEmail(email);
        expect(result).toBe(true);
      });
    
      test("returns false for an invalid domain", () => {
        const email = "user123@example.net";
        const result = isValidEmail(email);
        expect(result).toBe(false);
      });
    });
    
    上面的代码使用前面定义的 isValidEmail 函数,并通过提供有效和无效电子邮件对其进行测试。它通过将预期输出与实际输出匹配来检查验证结果。
  7. 保存并退出文件。

在 Vultr 上运行 Jest 测试

在本节中,您将学习如何通过应用两种方法使用 Jest 框架运行测试。在第一种方法中,我们将为前面各节中定义的每个函数运行单个单元测试。在第二种方法中,我们将同时运行这两个函数的测试。

运行单个单元测试

  1. 运行令牌验证测试。
    bash
    npm test -- tests/token.test.js
    
    如果测试成功通过,则您的输出将如下所示
     > sample@1.0.0 test
     > jest tests/token.test.js
    
     PASS  tests/token.test.js
     isTokenExpired
         ✓ should return false if the token is not expired (2 ms)
         ✓ should return true if the token is expired (1 ms)
    
     Test Suites: 1 passed, 1 total
     Tests:       2 passed, 2 total
     Snapshots:   0 total
     Time:        0.315 s, estimated 1 s
     Ran all test suites matching /tests\/token.test.js/i.
    
  2. 接下来,运行电子邮件验证测试。
    bash
    npm test -- tests/email.test.js
    
    如果测试成功通过,则您的输出将如下所示
    > sample@1.0.0 test
    > jest tests/email.test.js
    
    PASS  tests/email.test.js
    isValidEmail
        ✓ returns true for a valid email (2 ms)
        ✓ returns false for an invalid domain (1 ms)
    
    Test Suites: 1 passed, 1 total
    Tests:       2 passed, 2 total
    Snapshots:   0 total
    Time:        0.451 s
    Ran all test suites matching /tests\/email.test.js/i.
    

一起运行所有测试

使用以下命令一起运行所有测试

bash
npm test

如果测试成功通过,则您的输出将如下所示

> sample@1.0.0 test
> jest

PASS  tests/email.test.js
PASS  tests/token.test.js

Test Suites: 2 passed, 2 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        0.225 s, estimated 1 s
Ran all test suites.

结论

在本文中,我们查看了各种测试类型和测试约定。我们探讨了如何在预装了 Node.js 的 Vultr 服务器上使用 Jest 为函数编写和运行单元测试。通过利用 Jest 等工具,您可以提高代码的可靠性和鲁棒性,从而开发出更稳定和更易于维护的软件。

这是一篇由 Vultr 赞助的文章。Vultr 是全球最大的私有云计算平台。Vultr 深受开发人员的喜爱,已为 185 个国家/地区的 150 多万客户提供了灵活、可扩展的全球云计算、云 GPU、裸机和云存储解决方案。了解有关 Vultr 的更多信息。

关注 MDN 的最新资讯

订阅 MDN 时事通讯,不错过 Web 开发最新趋势、技巧和最佳实践的任何更新。