在 Vultr 上使用 Jest 测试 JavaScript
Jest 是一个流行的 JavaScript 测试框架,用于测试 React 和 JavaScript 代码库。它提供了一套全面的匹配器,用于进行断言,允许用户为不同类型的项目编写测试。Jest 将测试组织成测试套件;这种结构化方法提高了可维护性和可读性,从而提高了测试效率。
在本文中,我们将探讨软件开发中常用的各种测试类型,并分享一些良好的测试实践和约定。我们将编写 JavaScript 函数,并使用 Vultr 服务器上的 NodeJS 市场应用程序和 Jest 测试框架来测试它们。
测试类型
为了确保代码质量和功能,开发通常涉及三种类型的测试。每种类型都有特定的目的
-
单元测试:这些测试侧重于测试单个单元或组件,例如函数、方法或类。此类测试可确保每个代码组件本身都能正常运行。
-
集成测试:这些测试侧重于评估应用程序的不同组件是否按预期相互交互。与测试单个组件的单元测试不同,这些测试涉及多个单元之间的交互,以确保它们组合在一起时能按预期运行。
-
端到端测试:这些测试通过测试应用程序从头到尾的流程来模拟真实用户场景。这些测试通常是自动化的,并且像真实用户一样与应用程序进行交互,确保应用程序在实际情况中按预期工作。
测试约定
Arrange-Act-Assert (AAA) 模式是用于组织和结构化单元测试用例的常用约定。
为了理解每个部分,这里有一个示例,我们想测试用户电子邮件是否为字母数字(字母和数字)并使用 example.com 域
test("returns false for an invalid domain", () => {
const email = "user123@example.net";
const result = isValidEmail(email);
expect(result).toBe(false);
});
-
Arrange:在此阶段,您设置初始条件并准备测试环境。这包括初始化对象、设置输入和配置环境以创建您希望测试的场景。在上面的示例中,我们想测试
isValidEmail函数是否正确识别了无效电子邮件。我们已将email变量初始化为不符合我们电子邮件标准的字符串,因为它使用了.netTLD 而不是.com。 -
Act:在此阶段,您执行要测试的操作或行为。这可能包括调用方法、与对象交互或执行特定代码。在上面的示例中,此步骤涉及调用
isValidEmail函数并将email变量作为参数传递。 -
Assert:最后,在此阶段,您验证“Act”阶段的结果是否符合您的预期。在上面的示例中,我们使用了 Jest 框架提供的
expect函数来确认isValidEmail函数返回的result已被正确标识为false,正如对无效电子邮件所预期的那样。
在 Vultr 上设置项目目录
首先,请按照我们上一篇文章中 在 Vultr 上部署服务器 部分的步骤部署一个服务器。确保您在 **Marketplace Apps** 选项卡中选择了 **NodeJS**。接下来,让我们开始设置一个 Node.js 项目并安装 Jest 框架。然后,我们将在单独的 JavaScript 文件中定义两个函数,并在后续部分中对其进行测试。
-
使用以下命令验证 Node.js 安装
bashnode --version -
创建一个项目目录,并进入该目录。
bashmkdir sample cd sample -
初始化一个 Node.js 项目。
bashnpm init -y -
安装 Jest 测试框架。
bashnpm install --save-dev jest--save-dev标志用于指定包是作为开发依赖项安装的。这意味着它仅在开发和测试阶段使用,而在生产环境中不使用。 -
打开
package.json文件。我们使用的是 Nano 文本编辑器。请查看 快捷方式备忘单 以获取使用 Nano 的帮助。bashnano package.json -
添加一个测试脚本。
json"scripts": { "test": "jest" } -
保存并退出文件(按 Ctrl + X 关闭文件,出现提示时按 Y 保存更改)。
-
创建一个 JavaScript 文件。
bashnano token.js -
将以下代码复制并粘贴到
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 };上面的代码定义了两个函数
getTokenExpiryDate和isTokenExpired,它们计算提供的 JWT 令牌的过期日期,并根据令牌的过期状态返回true或false。 -
保存并退出文件。
-
创建另一个 JavaScript 文件。
bashnano email.js -
将以下代码复制并粘贴到文件中
javascriptfunction isValidEmail(email) { const emailRegex = /[a-zA-Z0-9]+@example\.com/; return emailRegex.test(email); } module.exports = { isValidEmail };上面的代码定义了一个
isValidEmail函数,该函数使用正则表达式验证提供的电子邮件的结构。正则表达式允许我们验证所有电子邮件是否为字母数字,并且以@example.com结尾。 -
保存并退出文件。
使用 Jest 编写单元测试
在本节中,您将学习如何使用 Jest 框架为前面定义的 JavaScript 函数编写单元测试。我们将把这些测试放在同一项目内的单独目录中。我们建议您遵循此处演示的文件命名约定,因为 Jest 会自动将以 .test.js 结尾的文件视为测试文件。
-
在
sample目录中,创建另一个名为tests的目录并导航到其中。bashmkdir tests cd tests -
创建一个 JavaScript 测试文件。
bashnano token.test.js -
将以下代码复制并粘贴到文件中
javascriptconst { 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,并使用它们代替上面的测试中的占位符。 -
保存并退出文件。
-
创建另一个 JavaScript 测试文件。
bashnano email.test.js -
将以下代码复制并粘贴到文件中
javascriptconst { 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函数,并通过提供有效和无效电子邮件对其进行测试。它通过将预期输出与实际输出进行匹配来检查验证结果。 -
保存并退出文件。
在 Vultr 上运行 Jest 测试
在本节中,您将学习如何使用 Jest 框架通过两种方法运行测试。在第一种方法中,我们将运行前面各节中定义的每个函数的单独单元测试。在第二种方法中,我们将同时运行这两个函数的测试。
运行单个单元测试
-
运行令牌验证测试。
bashnpm 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. -
接下来,运行电子邮件验证测试。
bashnpm 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.
同时运行所有测试
使用以下命令同时运行所有测试
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.
总结
在本文中,我们了解了各种测试类型和测试约定。我们探讨了如何在 Vultr 服务器上使用 Node.js(预装)和 Jest 编写和运行函数单元测试。通过利用 Jest 等工具,您可以提高代码的可靠性和健壮性,从而开发更稳定、可维护的软件。
这是一篇由 Vultr 赞助的文章。Vultr 是全球最大的私营云计算平台。Vultr 是开发者的首选,已为 185 个国家/地区的 150 万多客户提供了灵活、可扩展、全球化的云计算、云 GPU、裸金属和云存储解决方案。了解更多关于 Vultr 的信息。