Node.js 数据库自动化测试
我对自动化测试相当陌生,我想知道应该如何为数据库编写测试。我现在正在做的项目是在Node.JS环境中运行PostgreSQL和Sequelize作为ORM。如果有必要的话,我现在还使用Jest作为测试库 在我的应用程序中,我使用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
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();
});
});
});