如何通过SSH隧道实现Cypress与MySQL的连接?
Cypress 通过SSH隧道连接MySQL实现方法
Cypress 浏览器端运行的测试代码无法直接调用 Node 层的 mysql-ssh 包,所有涉及 Node 原生能力的操作都需要通过 task 注册到插件层实现,具体步骤如下:
步骤1:配置 cypress/plugins/index.js
在插件文件中注册自定义task,封装SSH连接、SQL执行、连接关闭的完整逻辑:
const mysqlssh = require('mysql-ssh'); const fs = require('fs'); module.exports = (on, config) => { on('task', { queryMysqlOverSsh(params) { const { sshConfig, dbConfig, sql } = params; // 自动读取私钥文件,也可直接传入已读取的privateKey内容跳过该步骤 if (sshConfig.privateKeyPath) { sshConfig.privateKey = fs.readFileSync(sshConfig.privateKeyPath); delete sshConfig.privateKeyPath; } return mysqlssh.connect(sshConfig, dbConfig) .then(client => { return new Promise((resolve, reject) => { client.query(sql, (err, results, fields) => { mysqlssh.close(); if (err) return reject(err); resolve(results); }) }) }) .catch(err => { // 连接出错时主动关闭隧道,避免资源残留 mysqlssh.close(); throw err; }) } }) }
步骤2:在 cypress/integration 测试用例中调用
直接在测试逻辑中通过cy.task调用注册好的方法即可获取查询结果:
describe('MySQL数据校验测试', () => { it('查询目标表数据并做断言', () => { cy.task('queryMysqlOverSsh', { // SSH服务器配置 sshConfig: { host: 'x.x.x.x', user: 'xyz', privateKeyPath: '替换为你的私钥文件绝对路径' }, // MySQL数据库配置 dbConfig: { host: 'HOST_NAME', user: 'USER_NAME', password: 'xxxx', database: 'DB_NAME' }, // 要执行的SQL语句 sql: 'select * from TABLE_NAME' }).then(queryResults => { // 示例:打印结果、做业务断言 console.log('SQL查询结果:', queryResults); expect(queryResults.length).to.be.greaterThan(0); }) }) })
注意事项
- 私钥路径建议使用绝对路径,避免Cypress运行时工作目录变动导致读取失败
- 敏感配置(SSH密码、数据库密码等)建议存储在Cypress环境变量中,不要硬编码在代码里
- 若需要执行多次SQL查询,可调整连接逻辑复用SSH隧道,避免频繁建连断连降低执行效率
内容的提问来源于stack exchange,提问作者Akshaya
相关产品推荐
相关产品推荐

