【问题标题】:Automated Testing with Databases使用数据库进行自动化测试
【发布时间】:2018-03-27 08:18:35
【问题描述】:

我是自动化测试的新手,想知道如何为数据库编写测试。我现在正在做的项目是在 Node.JS 环境中运行带有 Sequelize 作为 ORM 的 PostgreSQL。如果重要的话,我现在也使用 Jest 作为测试库。

【问题讨论】:

  • 可以这么说,您不应该“为数据库编写测试”。您应该为自己的代码编写测试。然后,该代码可以与该数据库交互。当您处于测试模式时,您的代码将连接到一个单独的测试数据库,这样您的测试就不会更改开发数据库中的数据。
  • FWIW - 在为使用 sequelize 的代码编写测试时,我通常在 sqlite 中为我的“真实”数据库分包。如果有用的话,我可以举一个 Mocha 的例子。
  • 感谢您的信息! @doublesharp 一个例子真的很有帮助,非常感谢!所以如果我没看错,我应该有一个“模拟”数据库,我运行我的函数来读取/写入/更新/删除请求并测试它的响应。有没有一种简单的方法可以将我的自动化测试指向我的“模拟”数据库?
  • Mocking 有点不同 - 你仍然想使用 sequelize 但换出 sqlite 作为内存实现。模拟意味着您将一个模块换成另一个模块 - 例如,我使用 ioredis 在生产中访问 Redis,但 fakeredis 用于测试。我模拟了ioredis,这样当你require() 时,你会得到fakeredis

标签: node.js postgresql testing sequelize.js jestjs


【解决方案1】:

在我的应用程序中,我使用config 模块来控制不同环境的配置设置。运行测试时,process.env.APP_ENV 设置为 test,它会将 dialect 设置为 sqlite。请注意,您不会有任何数据或数据持久性,因此您需要使用测试所需的所有数据填充它。

包括 sqlite3

yarn add -D sqlite3

npm i -D sqlite3

配置

module.exports = {
  database: {
    name: 'dbname',
    user: 'user',
    password: 'password',
    host: 'host',
    // Use "sqlite" for "test", the connection settings above are ignored
    dialect: process.env.APP_ENV === 'test' ? 'sqlite' : 'mysql',
  },
};

数据库/序列化

// get our config
const config = require('../config');

... // code

const instance = new Sequelize(
    config.database.name,
    config.database.user,
    config.database.password,
    {
      host: config.database.host,
      // set the dialect, will be "sqlite" for "test"
      dialect: config.database.dialect,
    }
);

测试类(摩卡)

const TestUtils = require('./lib/test-utils');

describe('Some Tests', () => {
  let app = null;

  // run before the tests start
  before((done) => {
    // Mock up our services
    TestUtils.mock();

    // these are instantiated after the mocking
    app = require('../server');

    // Populate redis data
    TestUtils.populateRedis(() => {
      // Populate db data
      TestUtils.syncAndPopulateDatabase('test-data', () => {
        done();
      });
    });
  });

  // run code after tests have completed
  after(() => {
    TestUtils.unMock();
  });

  describe('/my/route', () => {
    it('should do something', (done) => {
      return done();
    });
  });
});

运行测试

APP_ENV=test ./node_modules/.bin/mocha

您也可以通过其他方式使用 ENV 变量来设置方言和连接参数 - 以上只是基于我们使用大量支持代码所做的示例。

【讨论】:

  • 您不应该在您的测试环境和其他环境之间使用不同的数据库后端。那时您并没有真正测试您的生产环境可能是什么。
  • @coler-j 这取决于您要测试的内容。我们的 ci/cd 工具运行 docker 并模拟生产环境以在部署之前运行测试,但在某些情况下,您可能想要测试孤立的不相关功能(如果您能够使用 docker 或类似工具,则不太正确)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多