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

Protractor集成Oracle数据库测试无执行反馈问题求助

Protractor与OracleDB兼容问题排查及解决方案

当然可以兼容!Protractor本身基于Node.js,而node-oracledb是官方支持的Node.js Oracle数据库驱动,所以完全可以结合起来做UI操作后的数据库验证。你的测试直接通过却没执行查询,核心问题出在异步操作的处理上,Protractor没有等待数据库查询的异步任务完成就判定步骤结束了。

你的代码存在的问题

  1. 未返回异步操作的Promise:Protractor的测试步骤依赖异步任务的完成信号,你用了Promise链式调用但没把整个链返回给Protractor,它会直接认为同步步骤已完成,跳过等待数据库查询的逻辑。
  2. 错误处理写法错误:connection.execute的then回调里写function(result, err)是不对的——Promise的then只接收成功结果,错误要通过catch捕获。
  3. 未关闭数据库连接:长期运行会导致连接泄漏,耗尽数据库连接池资源。

解决方案

下面提供两种可行的修正方式,优先推荐更清晰的async/await写法:

方案1:使用async/await(推荐)

将step定义改为async函数,用await等待所有异步操作完成,同时完善错误处理和连接关闭逻辑:

const oracledb = require('oracledb');
const dbConfig = require('../configs/dbConfig');

Given(/^I run a random select query$/, async function() {
  let connection;
  try {
    // 等待获取数据库连接
    connection = await oracledb.getConnection(dbConfig);
    console.log('Connected to database');
    
    const sql2 = "Select * from tablename Where columname = 8888901";
    // 等待查询执行完成
    const result = await connection.execute(sql2);
    
    console.log(result.rows.toString());
    // 这里可以添加业务断言,比如验证返回数据是否符合预期
    // expect(result.rows.length).toBeGreaterThan(0);
  } catch (err) {
    // 捕获并打印错误,同时抛出错误让Protractor标记测试失败
    console.error('Database operation failed:', err);
    throw err;
  } finally {
    // 无论成功失败,都确保关闭连接
    if (connection) {
      try {
        await connection.close();
        console.log('Connection closed');
      } catch (closeErr) {
        console.error('Failed to close connection:', closeErr);
      }
    }
  }
});

方案2:返回完整的Promise链

如果更习惯Promise链式调用,要确保把整个Promise链返回给Protractor,修正错误处理逻辑:

const oracledb = require('oracledb');
const dbConfig = require('../configs/dbConfig');

Given(/^I run a random select query$/, function() {
  const sql2 = "Select * from tablename Where columname = 8888901";
  
  // 必须返回整个Promise链,让Protractor等待异步操作完成
  return oracledb.getConnection(dbConfig)
    .then(function(connection) {
      console.log('Connected to database');
      return connection.execute(sql2)
        .then(function(result) {
          console.log(result.rows.toString());
          // 添加业务断言逻辑
          // expect(result.rows.length).toBe(1);
          return connection.close(); // 执行完查询后关闭连接
        })
        .catch(function(err) {
          console.error('Query failed:', err);
          // 出错时也要关闭连接,再抛出错误
          if (connection) {
            return connection.close().then(() => { throw err; });
          }
          throw err;
        });
    })
    .catch(function(err) {
      console.error('Connection failed:', err);
      throw err;
    });
});

额外注意事项

  • 确保dbConfig里的连接参数(用户名、密码、连接字符串等)和你单独运行Node命令时完全一致。
  • 建议使用数据库连接池替代单次连接,性能更稳定,可参考node-oracledb官方文档配置连接池。
  • 数据库验证尽量只做必要的查询,避免执行耗时的大查询,影响测试整体速度。

内容的提问来源于stack exchange,提问作者Monnie_tester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:56