JavaScript 测试运行程序或 Node.js 测试运行程序通过启用一系列测试技术(包括单元测试、集成测试和端到端测试)来帮助自动化网站和 Web 应用程序的测试过程。
Node.js 测试运行程序可自动运行测试并提供结果反馈,以帮助有效识别和解决软件开发阶段的错误。
在本博客中,我们将了解如何利用 Node.js 测试运行器进行自动化测试,同时探索模拟和并行测试以及测试挂钩等方法。
Python、Ruby 和 Go 等编程语言都有内置的测试运行器,但 JavaScript 没有。 JavaScript 生态系统中的所有测试运行器,例如 Mocha、Jest 和 Jasmine,都是作为第三方包构建的。
当 Node.js 在 Node.js 版本 18 中发布了一个实验性的内置测试运行器并使该测试运行器在 Node.js 版本 20 中稳定时,这一切都发生了变化。
测试运行程序提供了多种功能,例如:
断言库
测试挂钩
模拟功能
代码覆盖率
测试记者
异步测试
Node.js 中的本机测试运行器为 JavaScript 自动化测试提供了多个优势。下面概述了使用此测试运行程序的一些好处:
测试运行程序通过节省决定使用哪个工具的时间来简化开发人员和测试人员的测试过程,因为它集成在 Node.js 本身中。
Node.js 测试运行器中内置的断言库简化了编写测试和获取测试结果的过程,无需安装其他断言库。
测试运行器包含代码覆盖功能,以确保通过查明尚未测试的部分来测试代码的所有部分。
本机测试运行程序有一个称为监视模式的功能,允许其监视测试文件及其依赖项的更改。如果检测到任何更改,测试运行器将自动重新运行受修改影响的测试。
使用 Node.js 进行测试可以使用模拟、存根和间谍,这对于独立于整个软件来测试各个组件非常重要。
在博客文章的这一部分中,您将学习如何开始使用 Node.js 内置测试运行器并成功运行测试脚本。
要开始使用,请按照以下说明操作;
请确保使用 Node.js 版本 20 或更高版本,因为自版本 20 发布以来,测试运行器已完全集成到 Node.js 的核心中。
创建一个 TestRunner 目录并使用集成开发环境 (IDE) 启动它。例如,在这个场景中,我们使用了 VS Code。
在终端中运行以下命令来设置 Node.js 项目:
npm init -y
在 TestRunner 目录中创建两个名为 src 和 tests 的新文件夹。
使用以下代码片段更新 package.json 文件中的测试脚本:
"scripts": { "test": "node --test TestRunner/tests/" },
通过运行以下命令安装 Selenium WebDriver:
npm install selenium-webdriver
`
运行下面给出的命令来安装 ChromeDriver:
npm 安装 chromedriver
在tests文件夹中创建一个新的started.test.js文件。然后,将以下代码添加到文件中:
`
const { Builder, By, Key, 直到 } = require("selenium-webdriver");
const assert = require("assert").strict;
const { test } = require("node:test");
{ let driver; test("Setup WebDriver for Google Search Test Suite", async (t) => { driver = await new Builder().forBrowser("chrome").build(); }); test("Navigate to Google and verify title", async (t) => { await driver.get("http://www.google.com"); const title = await driver.getTitle(); assert.strictEqual(title, "Google"); }); test("Cleanup after Google Search Test Suite", async (t) => { await driver.quit(); }); }
`
上面的代码从 node:test 和 node:assert 导入所需的函数,并描述了一个导航到 Google 并验证标题的简单测试。
运行下面给出的命令来执行测试:
节点测试/started.test.js
在 Node.js 测试运行器中,您可以使用 describe() 和 it() 块来运行测试。 describe() 块用于声明一个将相关测试组织和分组在一起的套件,而 it() 块用于声明一个测试。
使用 describe()/it() 块的好处是它提供了一种将测试组织成相关功能或特性的块的方法。这对于较大的测试套件非常有用,您希望在其中保持测试整齐地组织和逻辑分组。
在 describe() 块内,您可以有多个定义特定测试用例的 test() 或 it() 块。您还可以将 describe() 块相互嵌套,以创建测试子组以进行更详细的组织。
您可以使用 describe() 和 it() 块编写测试,如下所示。
在测试目录中创建一个describeit.test.js 文件并插入下面提供的代码片段:
`
描述(“表单输入测试”,async()=> {
让司机;
await it("Setup WebDriver", async () => { driver = await new Builder().forBrowser("chrome").build(); }); await it("should input values in a form and check their sum", async () => { await driver.get("https://www.lambdatest.com/selenium-playground/simple-form-demo"); await driver.findElement(By.id("sum1")).sendKeys(2); await driver.findElement(By.id("sum2")).sendKeys(3); await driver.findElement(By.xpath("//button[normalize-space()='Get Sum']")).click(); let sum = await driver.wait(until.elementLocated(By.id("addmessage")),10000); let sumNo = await sum.getText(); assert.strictEqual(sumNo, "5"); }); await it("Cleanup: Close the browser", async () => { await driver.quit(); }); });
`
运行下面给出的命令来执行测试:
节点测试/describeit.test.js
Node.js 测试运行器还允许您跳过测试。如果测试不稳定、正在测试的功能正在积极开发中、测试依赖于不可用的外部依赖项,或者测试是针对已弃用的功能,则您可以跳过测试。
可以通过将skip选项传递给测试或调用测试上下文的skip()注释来跳过单个测试。避免在内置测试运行器中运行测试的注释由指示器组成,例如 skip:true、skip;'此测试已跳过'、t.skip( ) 和 t.skip(“此测试被跳过”) 如此所示示例。
`
描述(“预期值严格相等”,async()=> {
让司机;
driver = wait new Builder().forBrowser("chrome").build();
it("应该严格相等", async () => {
等待 driver.get("http://www.google.com");
const title = wait driver.getTitle();
assert.strictEqual(title, "Google");
});
npm init -y
`
节点测试/skipping.test.js
Node.js 测试运行器提供了不同的测试挂钩。挂钩是在测试之前或之后立即运行的函数。 Node.js 测试运行器中可用的钩子是 before()、beforeEach()、after() 和 afterEach().
以下是如何使用这些钩子的一些示例:
**在()之前*钩子*
before() 钩子用于准备测试环境,它在 describe 块中的所有测试之前运行一次。例如,您可以使用 before() 挂钩在执行所有测试之前设置 WebDriver。
下面是如何使用 before() 钩子:
`
describe("简单表单演示标题测试", async () => {
让司机;
"scripts": { "test": "node --test TestRunner/tests/" },
`
节点测试/beforehook.test.js
**beforeEach() *Hook*
beforeEach() 钩子在每个测试之前运行一次,用于隔离测试,使它们不会相互影响。例如,如果您必须访问特定页面 URL 进行几次测试,则可以使用 beforeEach() 挂钩在执行每个测试之前打开该 URL 页面。
下面是如何使用 beforeEach() 钩子:
`
describe("简单表单演示测试", async () => {
让司机;
npm install selenium-webdriver
`
节点测试/beforeEachhook.test.js
**after() *钩子*
after() 钩子在所有测试执行后运行一次,用于在所有测试执行后执行清理操作。例如,如果您想在执行测试后关闭 WebDriver,可以使用 after() 钩子。
下面是如何使用 after() 钩子:
`
describe("简单表单演示测试", async () => {
让司机;
npm init -y
`
节点测试/afterhook.test.js
**afterEach() *Hook*
afterEach() 钩子在每次测试后运行一次。它用于在每次测试后执行清理操作。例如,如果您想在每次测试后清除 cookie,可以使用 afterEach() 钩子。
在测试目录中创建一个 afterEachhook.test.js 文件并插入下面提供的代码片段:
`
const { Builder, By, Key, 直到 } = require("selenium-webdriver");
const assert = require("assert").strict;
常量 {
描述,
它,
之前,
在每个之前,
之后,
每个之后,
} = require("节点:测试");
"scripts": { "test": "node --test TestRunner/tests/" },
`
运行下面给出的命令来执行测试:
节点测试/afterEachhook.test.js
Node.js 测试运行器的内置模拟功能使您能够在使用外部依赖项或第三方包的测试情况下模拟和替换函数。当这些依赖项仍处于开发阶段时,它特别方便。
您可以使用模拟功能来创建间谍和存根。下面是一个示例,说明如何使用模拟功能来验证从 API 获取数据:
首先,使用下面给出的命令安装 axios,这是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js:
npm 安装 axios
然后,创建一个index.js文件并添加以下代码:
`
const axios = require("axios");
npm install selenium-webdriver
`
上面的代码实现了一个 MakeRequest 类,该类具有三个函数 fetchDataFromAPI()、slugifyTitle() 和 addToDB().
然后,创建一个mock.test.js 文件并添加以下代码:
`
// 描述与mocking相关的测试
描述(“模拟测试”,async()=> {
// 在每次测试之前重置模拟
beforeEach(() => mock.restoreAll());
{ let driver; test("Setup WebDriver for Google Search Test Suite", async (t) => { driver = await new Builder().forBrowser("chrome").build(); }); test("Navigate to Google and verify title", async (t) => { await driver.get("http://www.google.com"); const title = await driver.getTitle(); assert.strictEqual(title, "Google"); }); test("Cleanup after Google Search Test Suite", async (t) => { await driver.quit(); }); }
`
在上面的代码中,fetchDataFromAPI 方法是从 MakeRequest 类模拟的。
为了防止函数发出网络请求,mockImplementation()方法用于返回预定义的输出,可以测试特定值。
最后,mock.method() 用于创建一个间谍来测试 slugifyTitle() 函数是否被调用。还有,函数被调用了多少次,以及它的输出是根据标题来测试的。
使用下面给出的命令运行测试:
节点测试/mock.test.js
Node.js 测试运行程序允许您同时并行执行多个测试,而不是按顺序运行它们。
要在 Node.js 测试运行器中并行运行测试,您需要将 concurrency: true 参数作为第二个参数传递给 describe() 函数。
下面是如何使用 Node.js 本机测试运行器和 Selenium 使用并发参数并行运行测试的示例。
在tests文件夹中创建parallel.test.js文件,并添加以下代码:
`
描述(“电子商务网站测试”,{并发:true},async()=>{
让司机;
npm init -y
`
运行下面给出的命令来运行测试:
节点测试/parallel.test.js
以上测试执行是在本地网格上执行的。但是,要使用 Node.js 扩展自动化测试,您可以考虑使用基于云的测试方法。
人工智能驱动的测试执行平台(如 LambdaTest)可让您在可扩展的自动化云基础设施上运行 Node.js 测试,确保兼容性和可靠性。
总之,Node.js 测试运行程序提供了一个轻量级解决方案,用于在 Web 项目中创建和执行自动化测试。尽管它可能不包含流行测试框架中的所有功能,但其简单性和用户友好性使其成为开始自动化测试的绝佳选择。
本博客讨论 Node.js 内置测试运行器的功能。它涵盖了如何使用 describe() 函数及其语法创建测试,同时使用钩子进行设置和拆卸操作,以及如何在并行线程中同时模拟和运行测试以保证 JavaScript 代码质量和稳定性增强目的。
对于复杂的测试情况,您可能需要针对流行的框架(例如 Mocha、Jasmine 或 Jest)评估默认测试运行器,以确定哪一个最适合您的要求。
以上是如何使用 Node.js 测试运行器:详细指南的详细内容。更多信息请关注PHP中文网其他相关文章!