如何在Node.js+Express框架中使用内存H2数据库开展单元测试?
步骤指南:Express API 连接 H2 数据库进行单元测试
1. 安装必要依赖
- 安装H2数据库的Node.js驱动,用于Express连接H2:
npm install h2 --save-dev - 若使用ORM(如Sequelize)简化数据库操作,可额外安装对应适配包:
npm install sequelize sequelize-h2 --save-dev
2. 配置H2数据库连接
- 单元测试推荐使用内存模式(数据仅在进程运行时存在,测试结束自动销毁),以下是两种常见配置方式:
- 原生驱动连接示例:
const h2 = require('h2'); const connection = h2.createConnection({ host: 'localhost', port: 9092, user: 'sa', password: '', database: 'mem:testdb' // 内存模式标识 }); - Sequelize ORM连接示例:
const { Sequelize } = require('sequelize'); const sequelize = new Sequelize('testdb', 'sa', '', { dialect: 'h2', storage: 'mem:testdb', logging: false // 关闭日志,避免测试输出杂乱 });
- 原生驱动连接示例:
3. 导入Oracle表结构与测试数据
- 导出Oracle表的DDL语句,将其调整为H2兼容语法(H2基本兼容Oracle,仅需少量修改:如
NUMBER替换为NUMERIC,SYSDATE替换为CURRENT_TIMESTAMP)。 - 在测试初始化脚本中执行DDL创建表,再插入测试数据:
async function initTestDB() { // 创建表结构 await sequelize.query(` CREATE TABLE IF NOT EXISTS users ( id NUMERIC PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); // 插入测试数据 await sequelize.query(` INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob') `); } - 也可读取本地SQL文件批量执行:
const fs = require('fs').promises; async function initTestDB() { const sqlContent = await fs.readFile('./test-data.sql', 'utf8'); await sequelize.query(sqlContent); }
4. 封装可切换的数据库操作层
- 通过环境变量区分生产(Oracle)与测试(H2)环境,避免代码耦合:
// db.js let db; if (process.env.NODE_ENV === 'test') { db = require('./h2-connection'); } else { db = require('./oracle-connection'); } async function getUserById(id) { const result = await db.query('SELECT * FROM users WHERE id = ?', [id]); return result[0]; } module.exports = { getUserById };
5. 编写单元测试用例
- 使用Jest/Mocha等测试框架,在测试前后完成数据库初始化与清理:
// users.test.js const request = require('supertest'); const app = require('../app'); const { initTestDB, sequelize } = require('../h2-connection'); beforeAll(async () => { await initTestDB(); // 测试前初始化表和数据 }); afterAll(async () => { await sequelize.close(); // 测试结束关闭连接 }); test('GET /users/:id 应返回指定用户', async () => { const response = await request(app).get('/users/1'); expect(response.statusCode).toBe(200); expect(response.body.name).toBe('Alice'); });
6. 运行单元测试
- 在
package.json中配置测试脚本:{ "scripts": { "test": "NODE_ENV=test jest" } } - 执行测试命令:
npm test
关键注意事项
- 开启Oracle兼容模式:若使用Oracle特有语法(如
CONNECT BY),需在连接字符串中添加;MODE=Oracle,确保语法兼容。 - 测试数据隔离:若需避免用例间数据干扰,可将
beforeAll替换为beforeEach,每个用例单独初始化数据。
内容的提问来源于stack exchange,提问作者skunwarc
相关产品推荐
相关产品推荐

