作为软件开发人员,编写测试是我们日常工作的重要组成部分。我们需要确保我们的代码按预期工作,并且可以处理不同的方案。测试的一个重要方面是确保我们的代码正确与数据库交互。但是,使用真实数据库进行测试可能是一个挑战。设置,难以管理并且可能带来意外后果可能是耗时的。
这就是测试范围的进来! ð
TestContainers是一个开源库,可让您运行用于测试的容器。使用TestContainers,您可以在几秒钟内旋转数据库容器,运行测试并处理容器。它消除了设置真实数据库的麻烦,并确保您的测试是隔离和可重复的。
让我们看看如何使用TestContainers测试与数据库交互的代码。
ðâ简单示例:
让我们从一个简单的示例开始。我们将使用TestContainers运行PostgreSQL数据库,并编写测试以插入和从数据库中检索数据。首先,我们需要安装TestContainers和PostgreSQL客户端:
npm install --save-dev testcontainers jest pg
接下来,让我们写测试:
const { GenericContainer } = require('testcontainers');
const Client = require('pg').Client;
describe('Test database', () => {
let client;
let container;
beforeAll(async () => {
container = await new GenericContainer('postgres', '12')
.withEnv('POSTGRES_USER', 'postgres')
.withEnv('POSTGRES_PASSWORD', 'secret')
.withExposedPorts(5432)
.start();
const host = await container.getContainerIpAddress();
const port = container.getMappedPort(5432);
const password = 'secret';
const database = 'testdb';
client = new Client({
host,
port,
user: 'postgres',
password,
database,
});
await client.connect();
});
afterAll(async () => {
await client.end();
await container.stop();
});
test('Insert data into the database', async () => {
await client.query('CREATE TABLE test (id serial, message text)');
const res = await client.query("INSERT INTO test (message) values ('hello world')");
expect(res.rowCount).toBe(1);
});
test('Retrieve data from the database', async () => {
const res = await client.query('SELECT * FROM test');
expect(res.rows[0].message).toBe('hello world');
});
});
在此示例中,我们使用beforeall钩启动PostgreSQL容器并连接到数据库。余整钩停止容器并关闭连接。在测试中,我们使用客户端与数据库进行交互。
ð结论:
TestContainers是测试与数据库交互的代码的绝佳工具。它可以轻松旋转容器,运行测试并处理容器。使用TestContainers,您可以确保测试是隔离,可重复和快速的。尝试一下,并升级您的测试游戏! ð
在此处查看TestContainers库:TestContainers on GitHub
让我知道您是否有任何疑问或反馈! ð