Node.js 数据库自动化测试

Node.js 数据库自动化测试,node.js,postgresql,testing,sequelize.js,jestjs,Node.js,Postgresql,Testing,Sequelize.js,Jestjs,我对自动化测试相当陌生,我想知道应该如何为数据库编写测试。我现在正在做的项目是在Node.JS环境中运行PostgreSQL和Sequelize作为ORM。如果有必要的话,我现在还使用Jest作为测试库 在我的应用程序中,我使用config模块控制不同环境的配置设置。运行测试时,process.env.APP_env被设置为test,它将方言设置为sqlite。请注意,您将没有任何数据或数据持久性,因此需要使用测试所需的所有数据填充它 包括sqlite3 纱线添加-D sqlite3 或 npm

我对自动化测试相当陌生,我想知道应该如何为数据库编写测试。我现在正在做的项目是在Node.JS环境中运行PostgreSQL和Sequelize作为ORM。如果有必要的话,我现在还使用Jest作为测试库

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

包括sqlite3

纱线添加-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,
    }
);
测试级(摩卡)

运行测试

APP\u ENV=test./node\u modules/.bin/mocha


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

您不应该这么说“为数据库编写测试”。您应该为自己的代码编写测试。然后,该代码可以与该数据库交互。当您处于测试模式时,您的代码将连接到一个单独的测试数据库,以便您的测试不会更改开发数据库中的数据。FWIW-当为使用sequelize I通常在sqlite中为我的“真实”数据库编写代码测试时。如果有用的话,我可以举一个摩卡咖啡的例子。谢谢大家提供的信息@doublesharp示例将非常有用,非常感谢!因此,如果我读对了,我应该有一个“mock”数据库,我可以运行我的函数来读取/写入/更新/删除请求,并测试来自该数据库的响应。有没有一种简单的方法可以将我的自动测试指向我的“mock”数据库?mock有点不同-您仍然希望使用
sequelize
,但将
sqlite
替换为内存中的实现。模拟意味着您将一个模块换成另一个模块-例如,我使用
ioredis
访问生产中的Redis,但使用
fakeredis
进行测试。我模拟
ioredis
,这样当你
require()
它时,你就会得到
fakeredis
。你不应该在测试和其他环境之间使用不同的DB后端。因此,您没有对您的生产环境进行真正的测试。@coler-j这取决于您正在测试的内容。我们的ci/cd工具运行docker并模拟生产环境,以便在部署之前运行测试,但在某些情况下,您可能希望测试独立的无关功能(如果您能够使用docker或类似工具,则情况就不太一样了)
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();
    });
  });
});