並行執行規範
5.0.0 及更新版本支援在 Node.js 中執行並行運算。如果您符合以下所有條件,即可並行執行 Jasmine 規範。
- 您使用
jasmine
套件在 Node.js 中執行規範。 - 啟用隨機化且未指定隨機種子後,您的規範始終通過。(這是 Jasmine 3.0 及更新版本的預設組態。)
- 如果您有任何未設定在
describe
內部的beforeAll
或afterAll
呼叫,僅用於設定非流程狀態,如資料庫,而非流程內狀態,如全域變數。 - 任何呼叫
beforeEach
或afterEach
設定在describe
內部或輔助檔案中。 - 如果您使用任何未隨 Jasmine 附上的報告器,您能夠 更新以支援並行模式。
使用並行模式
- 閱讀以下限制和錯誤清單,並確定清單中沒有任何項目適用於您。特別地,請確定您不必停用隨機化、指定隨機種子或指定自訂排序,才能讓您的套件可靠地執行。
- 設定
jasmine
相依項目為5.0.0
或更新版本。 - 將
--parallel=<n>
引數新增到jasmine
命令,例如jasmine --parallel=4
以在四個並行處理中執行規範。
理想的工作人員數量取決於您規範的性質以及可用 CPU 核心數量和類型。如果工作人員數量略低於核心數量,受 CPU 限制的套件通常能執行得最快。受 I/O 限制的套件可能會受益於較少的工作人員數量。
限制
以下限制僅適用於並行模式,而非正常順序執行模式。
- 無法停用隨機化,也無法設定隨機種子。
- 不支援
fit
和fdescribe
。 - 不支援在規範檔案頂層呼叫
beforeEach
和afterEach
。(在輔助檔案或describe
內部呼叫這些函式仍然完全支援。) - 僅支援在
describe
內部呼叫beforeAll
和afterAll
。如果您需要執行非流程狀態的確實一次性初始化,例如啟動資料庫或其他外部服務,請參閱下方說明的新全域設定/移除 API。 - 未搭載 Jasmine 的報表工具需要更新才能在並行模式中運行。如需詳細資訊,請見以下「報表工具」區段。
- 會變更狀態的
Env
方法(例如addReporter
、configure
等)不支援。請使用ParallelRunner
類別中的組態、CLI 參數或等效方法。 - 核心組態屬性
specFilter
不支援,因為無法將函式傳送到另一個程式。請改用 CLI 選項--filter=
或在ParallelRunner#execute
中,作為第二個參數傳遞篩選條件字串。
新的全域設定/清除 API
Jasmine 5.0 提供新的 API,可確切執行一次全域設定和清除。其目的是支援需要異常程式設定的平行執行情境,且不論工人數量為何,都只會進行一旦設定。它也可以在預設的順序執行模式中使用。
如需使用全域設定/清除 API,請將 globalSetup
和/或 globalTeardown
函式加入 Jasmine 組態,例如:
module.exports = {
spec_dir: "spec",
// ...
globalSetup() {
// ... your setup code here
}
globalTeardown() {
// ... your teardown code here
}
}
如果宣告全域設定/清除函式為 async
,或回傳承諾,Jasmine 會等到回傳的承諾解決後才會繼續執行。非同步回呼程式樣式不支援。
不確定該使用哪個設定/清除工具嗎?
- 如果需要在
describe
中的每個規格執行,請在該describe
中使用beforeEach
/afterEach
。 - 如果需要在整個套件中的每個規格執行,請在輔助檔案中使用
beforeEach
/afterEach
。(範例:加入應在全域可用的自訂比對程式。) - 如果需要在
describe
中的所有規格執行一次,請在該describe
中使用beforeAll
/afterAll
。 - 如果需要在整個套件中的所有規格執行一次,並初始化外部狀態,請使用
globalSetup
/globalTeardown
。頂層beforeAll
/afterAll
也可用於此,但不能在平行模式中使用。(範例:啟動外部服務或授予資料庫種子權限。) - 如果需要在整個套件中的所有規格執行一次,並初始化處理中狀態,您無法使用平行模式。
應注意的差異
- 某些類型的嚴重錯誤(例如載入規格或輔助檔案的錯誤)會在順序模式的
jasmineStarted
報表工具事件之前發生,而在平行模式中則會在事件之後發生。 - 由於多個規格同時執行,使用
console.log
在平行模式中除錯可能會很困難,甚至無法進行。建議在除錯時使用順序模式或jasmine.debugLog
。 - 盡可能支援 CLI 選項
--fail-fast
和組態設定stopOnSpecFailure
。執行會在第一次失敗後盡快停止。
更新報表工具以便在平行模式中運作
平行模式對報表工具施加許多限制。由於某些最受歡迎的第三方報表工具需要進行一些變更才能在平行模式中運作,Jasmine 會假設報表工具與平行模式不相容,除非它宣告相容性。報表工具可透過公開 reporterCapabilities
屬性(其值為 {parallel: true}
),宣告它與平行模式相容。
事件順序
必須注意的最大限制是,系統會根據從工作程序接收的順序傳送事件。這表示不相關的規格和套件的事件可能會穿插。如果某個報告程式假設 specDone
事件屬於最近收到的 specStarted
事件所屬的同一份規格,或者假設 suiteStarted
和 suiteDone
事件之間的所有事件都與該套件的子項目相關的話,則它將無法在並行模式中執行。Jasmine 僅會針對並行模式的事件順序提供下列保證:
jasmineStarted
會在所有其他事件前報告。jasmineDone
會在所有其他事件後報告。specStarted
會在同一份規格的specDone
事件之前報告。suiteStarted
會在同一份套件的suiteDone
事件之前報告。- 套件子項目的所有事件都會在套件的
suiteStarted
事件之後,但在其suiteDone
事件之前報告。
在 Jasmine 4.6 和更新的版本中,套件和規格報告程式的事件都有一個 parentSuiteId
屬性,讓報告程式可以在不需要依賴於事件順序的情況下,找出規格或套件的母項套件。
並行事件發送
在循序模式中,Jasmine 會在繼續下一步之前,等待非同步的報告程式函式完成執行。在並行模式中則不會這樣做。非同步報告程式必須做好準備,以並行處理事件或在內部放到佇列中。
API 差異
此外,報告程式使用的多個 API 都不可用或受到限制:
Env#topSuite
不可使用。jasmineStarted
報告程式事件沒有totalSpecsDefined
或order
欄位。JasmineDone
報告程式事件沒有order
欄位。
請注意,以上狀況僅適用於並行模式。在預設的循序模式中,Jasmine 5 完全相容於現有的報告程式。
程式化使用方式
可以使用 ParallelRunner
類別,以程式化的方式並行執行規格。
const ParallelRunner = require('jasmine/parallel');
const runner = new ParallelRunner({numWorkers: 3});
runner.loadConfigFile('spec/support/jasmine.json');
runner.execute();
ParallelRunner
支援與 Jasmine
類別相同的多種方法。有關詳細資訊,請參閱 API 參考文件。