在單一實例中分組執行規格
到目前為止,WebdriverIO 會建立一個單獨的實例來執行每個規格檔案。因此,如果我們的目錄結構看起來像這樣
test
└─── specs
│ test_login.js
│ test_product_order.js
│ test_checkout.js
│ test_b1.js
│ test_b2.js
並且組態檔中的規格定義如下
"specs": [
'./test/specs/test*.js'
],
那麼當 WebdriverIO 執行時,規格定義會被擴展以建立所有測試檔案的清單,並建立一個單獨的實例來執行每個測試(直到「maxInstances」的值)。剩餘的測試將被排隊,直到測試完成。因此,每個測試都在其自己的實例中執行。
此模型有很多優點。這意味著測試可以並行執行,並且更容易重試失敗的測試等。
但是,在某些情況下,此方法的效果不佳。在一個案例中,用戶的流程涉及為每個約 250 個測試檔案轉譯數以萬計的 TypeScript 檔案,導致測試速度的巨大開銷。在另一個案例中,遠端裝置農場正在為每個測試配置一個新裝置,以及所有相關的設定,從而影響效能和成本。
在Vertizan,我們正在將我們的人工智慧驅動和功能覆蓋率主導的 Vitaq 測試自動化工具與 WebdriverIO 和 Mocha 整合。為了使 Vitaq AI 正常工作,它需要能夠選擇接下來要執行的測試/動作,這需要所有測試都可以在單一實例中使用。
因此,我們已與 WebdriverIO 團隊合作,實作一種語法,允許使用者指定哪些測試應分組在一起在同一實例中執行。所有三個測試執行框架(Mocha、Jasmine、Cucumber)都支援此方法,並且預設情況下它們將依序執行測試。
為了利用此功能,WDIO 組態檔中規格的定義已擴展,使其現在可以接受規格陣列中的陣列。內部陣列中的所有檔案都會分組在一起,並在同一實例中執行。
因此,以下規格定義
"specs": [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
],
"./test/specs/test_b*.js",
],
如果針對先前描述的目錄樹執行,將產生三個實例
- 一個實例將執行 test_login.js、test_product_order.js 和 test_checkout.js 的群組
- 另一個實例將執行 test_b1.js
- 最後一個實例將執行 test_b2.js
只有規格定義支援此語法。
編輯: 此語法現在已擴展為支援在套件中定義的規格,因此您現在也可以像這樣定義套件
"suites": {
end2end: [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
]
],
allb: ["./test/specs/test_b*.js"]
},
在這種情況下,「end2end」套件的所有測試都將在單一實例中執行。