文件的這個章節將逐步說明如何測試您的 Sails 應用程式。Sails 和 Node.js 有無數的測試框架和斷言庫;選擇一個適合您需求的。
Sails 框架中沒有官方的測試策略,此頁面是一個協作的、社群驅動的指南,尚未經過 Sails 核心團隊成員的徹底審查。如果您遇到任何看起來令人困惑或不正確的地方,請隨時提交 pull request。
對於我們的範例測試套件,我們將使用 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 設定。
一個值得注意的自訂選項是 timeout。Mocha 中的預設 timeout 為 2 秒,對於大多數測試案例來說已足夠,但根據您的測試啟動和關閉 Sails 的頻率,可能會太短。為了確保 Sails 有足夠的時間啟動以完成您的第一個測試,您可能需要在 mocha.opts 中增加 timeout 值
--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 背後的想法是提供一個高階工具,幫助建構特定類型的測試——特別是,向您的 Sails 應用程式發送 HTTP 請求並檢查回應的測試類型。
// 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
script,但您仍然需要對其進行一些修改以用於此範例。如果您要升級現有的應用程式,您可能必須手動新增一個test
鍵。
如果您希望有一個系統在您每次推送到原始碼儲存庫時自動執行您的測試,那麼您很幸運!許多不同的持續整合系統都支援 Sails/Node.js,因此您可以選擇您喜歡的。以下是一些流行的入門選項
以上所有選項都對專有應用程式收取月費,但對於開放原始碼是免費的。Circle CI 對於專有應用程式也是免費的,但限制為一次兩個建置。Semaphore 也是免費的,並允許您 4 倍並行 CI/CD 工作。
有許多 商業選項 可用於負載測試 Web 應用程式。您也可以使用像 ab
或 JMeter 這樣的工具來合理地了解您的應用程式的效能。請記住,目標是模擬真實流量。有關設定 Sails 應用程式以使其準備好投入生產並可擴展的更多幫助,請參閱擴展性。如需其他協助或更具體的問題,請點擊這裡。
通常,您的應用程式的可擴展性和整體效能比對特定端點的任何給定個別請求的效能和延遲更重要。因此,我們建議從基礎知識開始,而不是專注於隔離的一段程式碼;對於大多數應用程式來說,這已經足夠好了。但是,對於某些用例(例如,投放廣告或具有非常計算密集型功能的應用程式),個別請求延遲可能從一開始就很重要。
為了測試特定程式碼區塊的效能,或為了基準測試對特定端點的個別請求的延遲,一個很好的選擇是 benchmark.js。它不僅是一個強大的函式庫,支援高解析度計時器並傳回具有統計意義的結果,而且它也可以與 Mocha 開箱即用。