使用 Docker 容器来击败不稳定的测试

即使方法参数和源代码(编写断言所针对的)保持不变,片状测试也会在不同的运行中产生不同的结果。不稳定可能是由多种因素共同引起的,包括随机性、争用条件或依赖项(如外部服务)。

在本文中,如何更改 Windows 11 上的默认下载位置我们将测试一个 Express.js 驱动的 Node.js 应用程序,该应用程序具有存储和读取职位列表的功能。我们将展示如何使用 Docker 容器击败不稳定的测试。为简洁起见,我们仅涵盖主题范围内的相关代码段。如何摆脱 Windows 11 上的小部件该代码可在 GitHub 存储库中进行浏览。

跳跃前进:

  • 为什么要避免片状测试?

  • 为什么在测试时使用 Docker 容器?

  • 测试节点.js应用程序设置和安装定义应用程序和测试配置引导我们的 Node.js 应用程序编写集成测试

  • 在 Docker 容器中运行测试

为什么要避免片状测试?

避免片状测试至关重要,如何在 Windows 11 上使用离线地图因为片状测试会损害软件完整性。片状测试也会降低开发速度,因为在运行缓慢的 CI 环境中会发生多个故障。

当特定断言在提供特定参数时返回特定结果时,如何更改 Outlook 桌面版和移动版中的字体样式测试是确定性的。函数式编程中的纯函数是用与确定性测试相同的规则编写的。软件模块与其他模块交互,并在应用程序生存期内共享状态。如何从 Windows 11 中的视频中删除声音编写不佳的测试有时会通过交叉污染引入状态不一致,其中先前测试运行的状态会影响正在运行的测试。这可能会导致测试不稳定,因为测试变得不确定。

不稳定行为的其他原因包括行为、并发问题和网络交互(使用不稳定系统)。为了降低其中一些场景的风险,我们必须确保测试得到适当的隔离,如何在桌面和移动设备上删除 Discord 服务器并将共享资源的使用降至最低。async

为什么在测试时使用 Docker 容器?

Docker 容器帮助我们保持测试环境的确定性。如何在 Windows 11 中旋转视频我们可以使用 Docker 容器将应用程序的运行时环境与其主机操作系统隔离开来。这使我们能够隔离文件系统、网络、系统调用和资源使用情况。

容器是轻量级的流程,价格低廉且易于创建和拆卸。这些品质使其成为隔离测试的理想选择。使用像 Docker Compose 这样的容器编排工具,如何在 Windows 10 和 Windows 11 中自动切换到最强 Wi-Fi我们可以在清单中定义依赖服务,使其成为为外部服务旋转模拟容器的理想选择。

本文的下一节将演示使用 Docker、Docker Compose、Knex.js 和 PostgreSQL 进行测试。

测试节点.js应用程序

保证在生产中运行的应用程序的行为非常重要。如何在 Windows 10 和 Windows 11 上访问和使用凭据管理器为了提高我们的置信水平,我们运行手动和自动测试。为了获得对测试套件的信心,我们需要测试输出具有可预测性和确定性。

在本文中,我们将测试一个 Express.s 驱动的 Node.js 应用。如何在 Windows 11 上将手机连接到 PC 的互联网我们将用于持久性,但我们将用于管理迁移、如何将机器人添加到您的 Discord 服务器种子和生成查询对象。Postgresknex

设置和安装

首先,克隆存储库并安装必要的依赖项:simple-job-board

git clone https://github.com/creatrixity/simple-job-board
cd simple-job-board
cp .env.example .env
npm install

由于应用程序具有作为服务依赖项,我们将运行一个 Docker 容器:PostgreSQLPostgreSQL

# 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 11 上更改默认系统字体我们还拉取了官方镜像,并在容器初始化时传递了一些配置选项。postgres

在 PostgreSQL 容器运行并侦听连接的情况下,如何阻止或取消阻止程序在 Windows 11 上使用 Internet我们将尝试连接到正在运行的实例。安装 CLI 后,执行:psql

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=# 

定义和配置applicationtesting

接下来,我们将用于获取环境变量。如何在 Windows 和 Mac 版 Microsoft Word 中使用 Grammarly我们还将设置一个小助手来为环境变量提供回退。然后,我们将 和 数据库主机的键定义为 .该文件可在以下位置获得:dotenvgetEnvVariableserver portlocalhostfallbackconfigsrc/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;

然后,在 中定义 和环境的配置。如何在 iTunes 上授权和取消授权 Windows PC定义这两个环境是相似的,除了 中的参数定义:./knexfile.tsdevelopmenttestinghosttesting

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 应用程序

接下来,我们将在 中引导我们的应用程序。如何在 Windows 11 上使用谷歌日历为了使我们的 Node.js 应用程序引导代码可重用,我们将在名为 的工厂函数中创建新的应用程序实例。src/index.tscreateServer

工厂将接受对数据库连接池文件描述符的引用和用于在其中公开应用程序的可选编号。如何在 Windows 上的 Outlook 中对电子邮件进行颜色编码createServerport

值得庆幸的是,它提供了对数据库连接的抽象: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);

检查从中导出工厂的文件后,我们将创建数据库连接引用的副本。如何在 Windows 11 中更改或删除用户帐户图像这可用于其他 Express 模块,方法是将其存储在 中。src/createServer.tscreateServerapp.locals

我们还有条件地收听提供的号码。如何在 Microsoft Edge 中禁用视觉搜索我们打算在测试设置中重用工厂,如果没有提供,则将应用程序绑定到随机:portcreateServersuperagentport

// 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;
}

编写集成测试

我们将为该模块添加几个集成测试。如何让 Windows 11 使用讲述人大声朗读文本在每个测试套件运行之前,我们将:job

  • 为临时测试构造随机唯一名称database

  • 获取连接Postgres

  • 使用生成的随机唯一名称创建临时测试database

  • 获取引用Postgresdatabase

  • 迁移新创建的并设定种子database

  • 调用以帮助创建 Express 应用程序的新实例并将新实例分配给顶级变量:createServerapp

  // 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);
  });

运行每个测试套件后,如何删除 hiberfil.sys 以释放 Windows 中的存储空间我们通过删除临时套件并关闭与 的连接来进行清理,以避免池匮乏并将资源利用率保持在最佳水平:databasedatabase

  // src/modules/job/job.test.ts
  // -------------------------------------------------------------------------
  // Tear Down
  // -------------------------------------------------------------------------
  afterAll(async () => {
    await knexSetup.raw(`DROP DATABASE ${databaseName}`);
    await knexSetup.destroy();
  });

对于这些情况,我们对查询前面步骤中的种子列表返回的数据运行断言。在 iPhone 和 Windows PC 之间传输文件的 5 种最佳方式我们通过 发出请求来创建新的作业记录。我们还断言在查询以下可用列表时返回的新作业记录:testjobsdatabasePOSTsuperagentjobsdatabase

// 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.

我们已经在本地开发环境中成功测试了我们的应用程序。如何在 Windows 11 上设置和使用 Google Chrome 远程桌面接下来,我们将在 Docker 容器中运行测试。

在 Docker 容器中运行测试

首先,我们将首先创建我们的应用程序映像,如何在台式机和移动设备上将 Microsoft Outlook 电子邮件另存为 PDF其中包含构建应用程序映像的说明:Dockerfile

FROM node:alpine

WORKDIR /usr/app
COPY ./ /usr/app

RUN npm install

# Define the command to run the test
CMD ["npm", "test"]

接下来,让我们定义一个包含两个服务的清单:如何从 Windows 11 回滚到 Windows 10为我们的 Express 应用程序运行测试的服务,以及服务,一个在容器中运行的 PostgreSQL 数据库:docker-compose.ymlsimple-job-boarddb

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"

然后,我们将通过运行来启动测试运行,如何跟踪 Microsoft Word 中的更改以确保我们的数据库服务在测试开始运行之前启动:docker-compose run test

我们的测试结果将通过在 Docker 容器中运行的绿色复选标记。如何在 Windows 11 上为应用程序和游戏设置首选 GPU您可能会注意到,在我们的测试运行之前,等待时间略有增加。这是因为我们启动 Docker 容器时产生的开销:

结论

借助 Docker 容器和测试隔离,如何将 Android 镜像到您的 Windows 11 PC我们大大减少了遇到不稳定测试的机会。在本文中,我们为每个测试运行创建了新连接并启动了新数据库,以确保每次运行都干净。我们还消除了作为剥落性来源的国家污染。但是,请记住,还有其他不稳定的来源,例如行为、并发问题和网络交互。重要的是要承认测试片状本质上是多变量的。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/129991070