本节文档介绍了如何测试你的 Sails 应用程序。Sails 和 Node.js 有无数的测试框架和断言库;选择一个适合你需求的。
Sails 框架没有官方的测试策略,本页是一个由社区驱动的协作指南,尚未经过 Sails 核心团队成员的全面审查。如果你遇到任何令人困惑或不正确的内容,请随时提交拉取请求。
对于我们的示例测试套件,我们将使用 mocha。
npm install mocha --save-dev
在开始构建测试用例之前,请组织你的 test/
目录结构。同样,在进行自动化测试时,你可以选择多种不同的组织方法。在本示例中,我们将按以下方式进行组织
./myApp
├── api/
├── assets/
├── ...
├── test/
│ ├── integration/
│ │ ├── controllers/
│ │ │ └── UserController.test.js
│ │ ├── models/
│ │ │ └── User.test.js
│ │ └── helpers/
| | └── ...
│ ├── fixtures/
| │ └── ...
│ ├── lifecycle.test.js
│ └── mocha.opts
├── ...
└── views/
当你想要在运行测试之前和之后执行某些代码时(例如,启动和关闭你的 Sails 应用程序),此文件很有用。由于你的模型在启动时被转换为 Waterline 集合,因此在尝试测试它们之前需要启动你的 Sails 应用程序(这也适用于控制器和应用程序的其他部分,因此请确保先调用此文件)。
var sails = require('sails');
// Before running any tests...
before(function(done) {
// Increase the Mocha timeout so that Sails has enough time to lift, even if you have a bunch of assets.
this.timeout(5000);
sails.lift({
// Your Sails app's configuration files will be loaded automatically,
// but you can also specify any other special overrides here for testing purposes.
// For example, we might want to skip the Grunt hook,
// and disable all logs except errors and warnings:
hooks: { grunt: false },
log: { level: 'warn' },
}, function(err) {
if (err) { return done(err); }
// here you can load fixtures, etc.
// (for example, you might want to create some records in the database)
return done();
});
});
// After all tests have finished...
after(function(done) {
// here you can clear fixtures, etc.
// (e.g. you might want to destroy the records you created above)
sails.lower(done);
});
此文件是可选的。你可以将其用作指定 自定义 Mocha 配置 的命令行选项的替代方法。
一个值得注意的自定义选项是超时。Mocha 中的默认超时时间为 2 秒,对于大多数测试用例来说已经足够了,但根据你的测试启动和关闭 Sails 的频率,可能太短了。为了确保 Sails 有足够的时间启动以完成你的第一个测试,你可能需要在 mocha.opts 中增加超时值。
--timeout 10000
注意:如果你使用的是像 CoffeeScript 这样的转译语言编写测试(
.coffee
文件而不是.js
文件),则需要采取额外的步骤来相应地配置 Mocha。例如,你可以在mocha.opts
中添加以下几行--require coffee-script/register --compilers coffee:coffee-script/register
_如果你更喜欢使用 Typescript,方法基本相同,只是你需要使用
--require ts-node/register
。
准备完目录后,就可以开始编写集成测试了。
// ./test/integration/models/User.test.js
var util = require('util');
describe('User (model)', function() {
describe('#findBestStudents()', function() {
it('should return 5 users', function (done) {
User.findBestStudents()
.then(function(bestStudents) {
if (bestStudents.length !== 5) {
return done(new Error(
'Should return exactly 5 students -- the students '+
'from our test fixtures who are considered the "best". '+
'But instead, got: '+util.inspect(bestStudents, {depth:null})+''
));
}//-•
return done();
})
.catch(done);
});
});
});
后端代码的最基本测试涉及发送 HTTP 请求并检查响应。你可以通过多种方式实现这一点,无论是像 Supertest 这样的完整的测试工具,还是像 request
或 mp-http
这样的纯实用程序,再结合 assert
。
让我们试用一下 Supertest。
npm install supertest --save-dev
Supertest 的理念是提供一个高级工具,帮助构建特定类型的测试,特别是发送 HTTP 请求到你的 Sails 应用程序并检查响应的测试。
// test/integration/controllers/UserController.test.js
var supertest = require('supertest');
describe('UserController.login', function() {
describe('#login()', function() {
it('should redirect to /my/page', function (done) {
supertest(sails.hooks.http.app)
.post('/users/login')
.send({ name: 'test', password: 'test' })
.expect(302)
.expect('location','/my/page', done);
});
});
});
为了使用 Mocha 运行测试,你需要在命令行中使用 mocha
,然后将要运行的任何测试作为参数传递。请确保在运行其他测试之前先调用 lifecycle.test.js,例如:mocha test/lifecycle.test.js test/integration/**/*.test.js
。
npm test
运行测试你可以修改 package.json 文件,使用 npm test
代替 Mocha,从而避免输入上面描述的 Mocha 命令。这在调用 lifecycle.test.js 时特别有用。
在 scripts 字典中,添加一个 test
键,并使用以下内容作为其值:mocha test/lifecycle.test.js test/integration/**/*.test.js
。它看起来像这样
"scripts": {
"start": "node app.js",
"debug": "node debug app.js",
"test": "node ./node_modules/mocha/bin/mocha test/lifecycle.test.js test/integration/**/*.test.js"
}
*
是一个通配符,用于匹配 integration/
文件夹中以 .test.js
结尾的任何文件。如果你喜欢,可以修改它以搜索 *.spec.js
。同样,你也可以使用两个 *
而不是一个来使用文件夹的通配符。
从 Sails v1 开始,Sails 应用程序会在它们的 package.json 文件中生成一个
test
脚本,但你仍然需要为此示例进行一些修改。如果你正在升级现有应用程序,可能需要手动添加test
键。
如果你希望每次将代码推送到源代码仓库时都自动运行测试,那么你很幸运!许多不同的持续集成系统支持 Sails/Node.js,因此你可以选择其中之一。以下是一些流行的选择,可以帮助你入门
以上所有选项都收取专有应用程序的每月费用,但对于开源应用程序来说是免费的。Circle CI 也免费,但专有应用程序的构建次数限制为每次两个。Semaphore 也是免费的,并允许你进行 4x 并行 CI/CD 作业。
存在 一些商业选项 用于对 Web 应用程序进行负载测试。你也可以使用 ab
或 JMeter 等工具来了解你的应用程序的性能。请记住,目标是模拟真实流量。有关设置你的 Sails 应用程序以使其适合生产环境和可扩展性的更多帮助,请参阅 可扩展性。如需其他帮助或更具体的问题,请点击 此处。
通常,应用程序的可扩展性和整体性能比任何特定端点接收的任何单个请求的性能和延迟更重要。因此,我们建议从 基础知识 开始,而不是专注于一段孤立的代码;对于大多数应用程序来说,这已经足够好了。但是,对于某些用例(例如,投放广告或功能计算量很大的应用程序),单个请求延迟可能从一开始就很重要。
对于测试特定代码块的性能,或对特定端点接收的单个请求的延迟进行基准测试,一个很好的选择是 benchmark.js。它不仅是一个支持高分辨率计时器并返回具有统计意义的结果的强大库,而且还与 Mocha 开箱即用地完美配合。