片状测试在不同的运行中产生不同的结果,即使方法参数和源代码(针对其编写的断言)是不变的。 不稳定可能是由多种因素共同引起的,如何在 Windows 11 PC 上使用动态锁定包括随机性、竞争条件或外部服务等依赖性。
在本文中,我们将测试 Express.js 驱动的 Node.js 应用程序 具有存储和读取工作列表功能的 。 我们将展示如何使用 Docker 容器来应对易碎测试。如何在不重启的情况下在 Windows 10 和 11 PC 上进入 BIOS 为简洁起见,我们将仅涵盖主题范围内的相关代码片段。 该代码可在 GitHub 存储库 中进行探索。
跳跃前进:
为什么要避免片状测试?
为什么在测试时使用 Docker 容器?
测试 Node.js 应用程序设置和安装定义 application和 testing配置引导我们的 Node.js 应用程序编写集成测试
在 Docker 容器中运行测试
为什么要避免片状测试?
避免不稳定的测试是至关重要的,如何在 Windows 11 上创建和修改硬盘分区因为不稳定的测试会损害软件的完整性。 片状测试还会降低开发速度,因为在运行缓慢的 CI 环境 中会发生多次故障。
当特定断言在提供特定参数时返回特定结果时,在 Windows 10 和 11 上安全清理注册表的 3 种方法测试是确定性的。 函数式编程中的纯函数使用与确定性测试相同的规则编写。 软件模块与其他模块交互并在应用程序生命周期内共享状态。 如何在 Windows 11 上使用存储空间功能编写糟糕的测试有时会通过交叉污染引入状态不一致,其中来自先前测试运行的状态会影响正在运行的测试。 当测试变得不确定时,在 Windows 10 和 Windows 11 中获取帮助的 7 种方法这可能会导致测试不稳定。
不稳定行为的其他原因包括 async行为、如何在 Windows 11 上使用 BitLocker 加密数据并发问题和网络交互(与不稳定的系统)。 为了降低其中一些场景的风险,我们必须确保正确隔离测试,并最大限度地减少共享资源的使用。
为什么在测试时使用 Docker 容器?
Docker 容器 帮助我们保持测试环境的确定性。如何在移动设备和桌面设备上查找 Google Chrome 下载 我们可以使用 Docker 容器将应用程序的运行时环境与其主机操作系统隔离开来。 在 Windows 11 上批量重命名文件的 4 种简单方法这使我们能够隔离文件系统、网络、系统调用和资源使用。
容器是一种轻量级流程,成本低廉且易于创建和拆卸。 如何在 Windows 11 上使用密码保护文件夹这些特性使它们成为 隔离测试 的理想选择。 这样的容器编排工具 使用像Docker Compose ,我们可以在清单中定义依赖服务,如何在 Windows 11 上使用 Windows 内存诊断工具使其成为为外部服务旋转模拟容器的理想选择。
本文的下一部分将演示使用 Docker 、 Docker Compose 、 Knex.js 和 PostgreSQL 进行测试。
测试 Node.js 应用程序
保证在生产中运行的应用程序的行为很重要。如何在 Windows 11 上使用实时字幕 为了提高我们的信心水平,我们运行手动和 自动测试 。 为了获得对我们的测试套件的信心,我们需要测试输出是可预测和确定的。
在本文中,我们将测试一个由 Express.s 支持的 Node.js 应用程序。 我们将使用 Postgres为了持久性,但我们将使用 knex管理迁移在 Windows 上检查硬盘驱动器健康状况的 4 种方法、种子和构建查询对象。
设置和安装
首先,克隆 simple-job-board回购并安装必要的依赖项:
git clone https://github.com/creatrixity/simple-job-board
cd simple-job-board
cp .env.example .env
npm install
由于应用程序具有 PostgreSQL作为服务依赖,我们将运行一个 容器 Docker PostgreSQL:
# We need to create an isolated bridge network to allow us connect to our instances
docker create network simple-job-board --driver bridge
docker pull postgres
docker run --name simple-job-board-postgres -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=5uperIn5ecurePa55word -e POSTGRES_DB=simple-job-board -p 5432:5432 -d postgres
在上面的代码片段中,在 Windows 10 或 Windows 11 上查找产品密钥的 3 种快速方法我们 定义了一个隔离的桥接网络 为应用程序 。 我们也拉了官 postgres图像并在容器初始化时传递一些配置选项。
在 PostgreSQL 容器运行并侦听连接的情况下,我们将尝试连接到正在运行的实例。 随着 psql安装CLI,执行:
psql -h 127.0.0.1 -p 5432 -U postgres -d simple-job-board
我们应该在下面得到如下提示,表示连接成功:
# psql (13.3, server 15.0 (Debian 15.0-1.pgdg110+1))
# WARNING: psql major version 13, server major version 15.
# Some psql features might not work.
# Type "help" for help.
# simple-job-board=#
定义application和testing配置
接下来,我们将使用 dotenv获取环境变量。如何在 Windows 11 上生成和读取电池报告 我们也会设置一点 getEnvVariable帮助程序为环境变量提供回退。 然后我们为 server port和数据库主机 localhost作为 fallback. 如何增加 Windows 11 中的虚拟内存这 config文件可在 src/config.ts:
import dotenv from "dotenv";
dotenv.config();
function getEnvVariable(name: string, fallback: string = ""): string {
const envVariable = process.env[name];
const fallbackProvided = fallback.length;
if (!envVariable && !fallbackProvided) {
throw new Error(`Environment variable ${name} has not been set.`);
}
return envVariable || fallback;
}
const config = {
server: {
port: Number(getEnvVariable("PORT")),
},
database: {
host: getEnvVariable("DATABASE_HOST", "localhost"),
},
};
export default config;
然后,在 ./knexfile.ts, 定义配置 development和 testing环境。什么是 MIDI 文件以及如何在 Windows 11 中打开它们 定义这两个环境是相似的,除了 host参数输入 testing:
import type { Knex } from "knex";
import appConfig from "./src/config";
// Update with your config settings.
const config: { [key: string]: Knex.Config } = {
development: {
client: "postgresql",
connection: {
user: "postgres",
password: "5uperIn5ecurePa55word",
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
tableName: "knex_migrations",
},
},
testing: {
client: "postgresql",
connection: {
user: "postgres",
password: "5uperIn5ecurePa55word",
host: appConfig.database.host,
port: 5432,
},
pool: {
min: 2,
max: 10,
},
migrations: {
tableName: "knex_migrations",
},
},
};
module.exports = config;
引导我们的 Node.js 应用程序
接下来,我们将引导我们的应用程序 src/index.ts. 为了让我们的 Node.js 应用程序引导程序代码可重用,如何在 Windows 和 Mac 上将 MKV 转换为 MP4我们将在名为的工厂函数中创建新的应用程序实例 createServer .
这 createServer工厂将接受对数据库连接池文件描述符的引用和一个可选的 port公开其中的应用程序的编号。
谢天谢地, knex提供对数据库连接的抽象:
// src/index.ts
import knex from "knex";
import config from "./config";
import { createServer } from "./createServer";
const knexConfig = require("../knexfile");
const knexSetup = knex(knexConfig.development);
createServer(knexSetup, config.server.port);
检查后 src/createServer.ts从中的文件 createServer工厂被导出,从 Windows 11 中删除登录密码的 4 种最佳方法我们将复制数据库连接引用。 这可用于其他 Express 模块, 方法是将其存储在 app.locals.
我们也有条件地听取提供的 port数字。如何从 Windows 11 中删除 Microsoft 帐户 我们打算重用 createServer我们测试设置中的工厂,以及 superagent将应用程序绑定到随机 port如果没有提供:
// src/createServer.ts
export function createServer(dbConnection: Knex, port?: number): Express {
const app: Express = express();
app.use(bodyParser.json());
// Cache a copy of the dbConnection socket
app.locals.dbConnection = dbConnection;
app.use("/jobs", jobsRouter);
app.get("/", (_req: Request, res: Response) => {
res.json({ message: "Hello ! Welcome to the simple job board app" });
});
if (port) {
app.listen(port, () => {
console.log(` Server is running at https://localhost:${port}`);
});
}
return app;
}
编写集成测试
我们 将为 _ job模块。 如何在 Windows 11 上下载和使用 Steam在每个测试套件运行之前,我们将:
为临时测试构建一个随机的唯一名称 database
获得一个 Postgres联系
创建临时测试 database使用生成的随机唯一名称
获得新的 Postgres引用的连接 database
迁移和播种新创建的 database
称呼 createServer帮助创建 Express 应用程序的新实例并将新实例分配给顶层 app多变的:
// src/modules/job/job.test.ts
// -------------------------------------------------------------------------
// Setup up
// -------------------------------------------------------------------------
let app: Express;
let knexSetup: Knex;
let databaseName: string;
beforeAll(async () => {
databaseName = uniqueNamesGenerator({
dictionaries: [colors, adjectives, animals],
});
knexSetup = knex(knexConfig.testing);
await knexSetup.raw(`CREATE DATABASE ${databaseName}`);
knexSetup = knex({
...knexConfig.testing,
database: databaseName,
});
await knexSetup.migrate.latest();
await knexSetup.seed.run();
app = createServer(knexSetup);
});
在每个测试套件运行后,如何在 Windows 11 上打开蓝牙:5 种简单方法我们通过删除临时文件来清理 database并关闭与 database为了避免池饥饿并将资源利用率保持在最佳水平:
// src/modules/job/job.test.ts
// -------------------------------------------------------------------------
// Tear Down
// -------------------------------------------------------------------------
afterAll(async () => {
await knexSetup.raw(`DROP DATABASE ${databaseName}`);
await knexSetup.destroy();
});
为了 test情况下,如何在 Windows 11 中更改或禁用通知声音我们对查询列表返回的数据运行断言 jobs播种到 database在前面的步骤中。 我们通过发布一个新的工作记录 POST请求通过 superagent. 我们还断言查询列表时返回的新工作记录 jobs可在 database:
// src/modules/job/job.test.ts
import { jobData } from "../../../seeds/jobs";
describe("/jobs", () => {
// -------------------------------------------------------------------------
// Test cases
// -------------------------------------------------------------------------
test("GET: / should return a success status", async () => {
await request(app).get("/").expect("Content-Type", /json/).expect(200);
});
test("GET: /jobs should return a list of jobs", async () => {
const result = await request(app).get("/jobs");
expect(
result.get("Content-Type").includes("application/json")
).toBeTruthy();
expect(result.statusCode).toEqual(200);
expect(result.body.results).toEqual(
expect.arrayContaining(jobData.map((job) => expect.objectContaining(job)))
);
});
test("POST: /jobs should create a new job", async () => {
const jobCreationData = {
role: "Virtual Reality Designer",
location: "Seattle",
organization: "Microsoft",
description: "Reimagine virtual reality experiences",
};
const jobCreationResponse = await request(app)
.post("/jobs")
.send(jobCreationData)
.set("Accept", "application/json");
expect(jobCreationResponse.statusCode).toEqual(201);
const jobsResponse = await request(app).get("/jobs");
const jobs = jobsResponse.body.results;
expect(jobs[jobs.length - 1]).toMatchObject(jobCreationData);
});
});
跑步 npm test应该给我们下面的输出:
PASS src/modules/job/job.test.ts
/jobs
✓ GET: / should return a success status (267 ms)
✓ GET: /jobs should return a list of jobs (64 ms)
✓ POST: /jobs should create a new job (97 ms)
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 3.705 s, estimated 14 s
Ran all test suites.
Watch Usage: Press w to show more.
我们已经在本地开发环境中成功测试了我们的应用程序。 接下来,我们将在 Docker 容器中运行测试。
在 Docker 容器中运行测试
首先,我们将开始创建我们的 如何在 Mac 和 Windows 上为 Microsoft Word 文档添加密码Dockerfile的说明 使用构建我们的应用程序图像 :
FROM node:alpine
WORKDIR /usr/app
COPY ./ /usr/app
RUN npm install
# Define the command to run the test
CMD ["npm", "test"]
接下来,让我们定义一个 docker-compose.yml包含两个服务的清单: simple-job-board为我们的 Express 应用程序和运行测试的服务 db服务,在 Windows 中连接到隐藏 Wi-Fi 网络的 3 种方法一个在容器中运行的 PostgreSQL 数据库:
version: "3"
services:
simple-job-board:
build: .
environment:
DATABASE_HOST: db
links:
- db
db:
image: postgres:11
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 5uperIn5ecurePa55word
POSTGRES_DB: simple-job-board
ports:
- "5432:5432"
然后,如何在 Windows 11 上启用和使用语音访问我们将通过运行来启动测试运行 docker-compose run test确保我们的数据库服务在我们的测试开始运行之前启动:
我们的测试结果将通过并在 Docker 容器中运行绿色复选标记。如何在 Windows 11 上导出或导入电源计划 在我们的测试运行之前,您可能会注意到等待时间略有增加。 这是因为启动 Docker 容器时产生的开销:
结论
使用 Docker 容器和测试隔离,如何更改 Microsoft Word 中的默认页面布局我们大大减少了遇到不稳定测试的机会。 在本文中,我们为每次测试运行创建了新连接并启动了新数据库,以确保每次运行都是干净的。 我们还消除了作为片状来源的状态污染。 但是,请记住还有其他来源的薄片,例如 async行为、并发问题和网络交互。 重要的是要承认测试片状性本质上是多变量的。