You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:30:57