組織測試套件
隨著專案成長,不可避免地會加入越來越多的整合測試。這會增加建置時間並降低生產力。
為了防止這種情況,您應該並行執行測試。WebdriverIO 已經在單一會話中並行測試每個規格(或 Cucumber 中的功能檔案)。一般而言,請嘗試每個規格檔案只測試單一功能。嘗試不要在一個檔案中包含太多或太少的測試。(但是,這裡沒有黃金法則。)
一旦您的測試有多個規格檔案,您應該開始並行執行測試。要執行此操作,請調整您設定檔中的 maxInstances
屬性。WebdriverIO 允許您以最大並行性執行測試,這表示無論您有多少檔案和測試,它們都可以全部並行執行。(這仍然會受到某些限制,例如您電腦的 CPU、並行性限制等。)
假設您有 3 種不同的功能(Chrome、Firefox 和 Safari),並且您已將
maxInstances
設定為1
。WDIO 測試執行器將產生 3 個處理程序。因此,如果您有 10 個規格檔案,並且您將maxInstances
設定為10
,則所有規格檔案將會同時測試,並且會產生 30 個處理程序。
您可以全域定義 maxInstances
屬性,以為所有瀏覽器設定屬性。
如果您執行自己的 WebDriver 格線,您可能(例如)有一個瀏覽器的容量比另一個瀏覽器大。在這種情況下,您可以在您的功能物件中限制 maxInstances
。
// wdio.conf.js
export const config = {
// ...
// set maxInstance for all browser
maxInstances: 10,
// ...
capabilities: [{
browserName: 'firefox'
}, {
// maxInstances can get overwritten per capability. So if you have an in-house WebDriver
// grid with only 5 firefox instance available you can make sure that not more than
// 5 instance gets started at a time.
browserName: 'chrome'
}],
// ...
}
繼承自主設定檔
如果您在多個環境(例如,開發和整合)中執行測試套件,使用多個設定檔來保持事情易於管理可能會有所幫助。
與頁面物件概念類似,您需要的第一件事是主要設定檔。它包含您在各個環境中共享的所有設定。
然後為每個環境建立另一個設定檔,並使用環境特定的設定檔補充主要設定檔
// wdio.dev.config.js
import { deepmerge } from 'deepmerge-ts'
import wdioConf from './wdio.conf.js'
// have main config file as default but overwrite environment specific information
export const config = deepmerge(wdioConf.config, {
capabilities: [
// more caps defined here
// ...
],
// run tests on sauce instead locally
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,
services: ['sauce']
}, { clone: false })
// add an additional reporter
config.reporters.push('allure')
在套件中分組測試規格
您可以將測試規格分組到套件中,並執行單個特定套件而不是全部套件。
首先,在您的 WDIO 設定中定義您的套件
// wdio.conf.js
export const config = {
// define all tests
specs: ['./test/specs/**/*.spec.js'],
// ...
// define specific suites
suites: {
login: [
'./test/specs/login.success.spec.js',
'./test/specs/login.failure.spec.js'
],
otherFeature: [
// ...
]
},
// ...
}
現在,如果您只想執行單個套件,您可以將套件名稱作為 CLI 引數傳遞
wdio wdio.conf.js --suite login
或者,一次執行多個套件
wdio wdio.conf.js --suite login --suite otherFeature
分組測試規格以依序執行
如上所述,並行執行測試是有好處的。但是,在某些情況下,將測試分組在一起以便在單一實例中依序執行會很有益。這方面的例子主要是存在大量設定成本的地方,例如轉譯程式碼或配置雲端執行個體,但也存在可以從此功能中受益的高階使用模型。
若要將測試分組以便在單一實例中執行,請在規格定義中將它們定義為陣列。
"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_b*" 測試將在個別實例中並行執行。
也可以將在套件中定義的規格分組,因此您現在也可以像這樣定義套件
"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」套件的所有測試都將在單一實例中執行。
當使用模式依序執行測試時,它將按照字母順序執行規格檔案
"suites": {
end2end: ["./test/specs/test_*.js"]
},
這將按照以下順序執行符合上述模式的檔案
[
"./test/specs/test_checkout.js",
"./test/specs/test_login.js",
"./test/specs/test_product_order.js"
]
執行選定的測試
在某些情況下,您可能只想執行套件的單一測試(或測試子集)。
透過 --spec
參數,您可以指定應該執行哪個套件(Mocha、Jasmine)或功能(Cucumber)。路徑是從您目前的工作目錄解析的。
例如,若要僅執行您的登入測試
wdio wdio.conf.js --spec ./test/specs/e2e/login.js
或一次執行多個規格
wdio wdio.conf.js --spec ./test/specs/signup.js --spec ./test/specs/forgot-password.js
如果 --spec
值未指向特定的規格檔案,則它會改為用來篩選您的設定中定義的規格檔案名稱。
若要執行規格檔案名稱中包含「dialog」一詞的所有規格,您可以使用
wdio wdio.conf.js --spec dialog
請注意,每個測試檔案都在單一測試執行器處理程序中執行。由於我們不會事先掃描檔案(如需有關將檔案名稱傳送到 wdio
的資訊,請參閱下一節),因此您無法(例如)在您的規格檔案的頂端使用 describe.only
來指示 Mocha 只執行該套件。
此功能將協助您達成相同的目標。
當提供 --spec
選項時,它會覆寫設定或功能層級的 specs
參數所定義的任何模式。
排除選定的測試
如果需要,如果您需要從執行中排除特定的規格檔案,您可以使用 --exclude
參數 (Mocha、Jasmine) 或功能 (Cucumber)。
例如,若要從測試執行中排除您的登入測試
wdio wdio.conf.js --exclude ./test/specs/e2e/login.js
或者,排除多個規格檔案
wdio wdio.conf.js --exclude ./test/specs/signup.js --exclude ./test/specs/forgot-password.js
或者,在使用套件篩選時排除規格檔案
wdio wdio.conf.js --suite login --exclude ./test/specs/e2e/login.js
如果 --exclude
值未指向特定的規格檔案,則它會改為用來篩選您的設定中定義的規格檔案名稱。
若要排除規格檔案名稱中包含「dialog」一詞的所有規格,您可以使用
wdio wdio.conf.js --exclude dialog
當提供 --exclude
選項時,它會覆寫設定或功能層級的 exclude
參數所定義的任何模式。
執行套件和測試規格
執行整個套件以及個別規格。
wdio wdio.conf.js --suite login --spec ./test/specs/signup.js
執行多個特定測試規格
有時,在持續整合或其他情況下,有必要指定要執行的多組規格。WebdriverIO 的 wdio
命令列公用程式接受管道輸入的檔案名稱(來自 find
、grep
或其他)。
管道輸入的檔案名稱會覆寫設定的 spec
清單中指定的 glob 或檔案名稱清單。
grep -r -l --include "*.js" "myText" | wdio wdio.conf.js
注意:這將不會覆寫用於執行單一規格的 --spec
旗標。
使用 MochaOpts 執行特定測試
您也可以透過傳遞 mocha 特定的引數:--mochaOpts.grep
到 wdio CLI,來篩選您想要執行的特定 suite|describe
和/或 it|test
。
wdio wdio.conf.js --mochaOpts.grep myText
wdio wdio.conf.js --mochaOpts.grep "Text with spaces"
注意: Mocha 會在 WDIO 測試執行器建立實例後篩選測試,因此您可能會看到產生多個實例,但實際上並未執行。
使用 MochaOpts 排除特定測試
您還可以透過傳遞 Mocha 特定的參數:--mochaOpts.invert
給 wdio CLI,來篩選要排除的特定 suite|describe
和/或 it|test
。 --mochaOpts.invert
的作用與 --mochaOpts.grep
相反。
wdio wdio.conf.js --mochaOpts.grep "string|regex" --mochaOpts.invert
wdio wdio.conf.js --spec ./test/specs/e2e/login.js --mochaOpts.grep "string|regex" --mochaOpts.invert
注意: Mocha 會在 WDIO 測試執行器建立實例後篩選測試,因此您可能會看到產生多個實例,但實際上並未執行。
在失敗後停止測試
透過 bail
選項,您可以告知 WebdriverIO 在任何測試失敗後停止測試。
當您已經知道您的建置會失敗,但又想避免漫長的完整測試執行等待時,這會很有幫助。
bail
選項預期一個數字,指定在 WebDriver 停止整個測試執行前,可以發生多少次測試失敗。預設值為 0
,表示它總是會執行所有可以找到的測試規範。
請參閱選項頁面以取得關於 bail 設定的更多資訊。
執行選項階層
當宣告要執行的規範時,有一個特定的階層定義哪個模式會優先。目前,這是它的運作方式,從最高優先順序到最低優先順序:
CLI
--spec
參數 > capabilityspecs
模式 > configspecs
模式 CLI--exclude
參數 > configexclude
模式 > capabilityexclude
模式
如果只給定了 config 參數,它將用於所有 capabilities。但是,如果在 capability 層級定義了模式,則會使用它來代替 config 模式。最後,在命令列上定義的任何 spec 模式都將覆蓋所有其他給定的模式。
使用 capability 定義的 spec 模式
當您在 capability 層級定義 spec 模式時,它將覆蓋在 config 層級定義的任何模式。當需要根據不同的裝置 capabilities 來區分測試時,這非常有用。在這種情況下,在 config 層級使用通用的 spec 模式,而在 capability 層級使用更具體的模式會更有用。
例如,假設您有兩個目錄,一個用於 Android 測試,另一個用於 iOS 測試。
您的設定檔可能會定義這樣的模式,用於非特定裝置的測試
{
specs: ['tests/general/**/*.js']
}
但是,您會為您的 Android 和 iOS 裝置設定不同的 capabilities,其中模式可能看起來像這樣
{
"platformName": "Android",
"specs": [
"tests/android/**/*.js"
]
}
{
"platformName": "iOS",
"specs": [
"tests/ios/**/*.js"
]
}
如果您在設定檔中同時需要這兩種 capabilities,則 Android 裝置將只會執行 "android" 命名空間下的測試,而 iOS 測試將只會執行 "ios" 命名空間下的測試!
//wdio.conf.js
export const config = {
"specs": [
"tests/general/**/*.js"
],
"capabilities": [
{
platformName: "Android",
specs: ["tests/android/**/*.js"],
//...
},
{
platformName: "iOS",
specs: ["tests/ios/**/*.js"],
//...
},
{
platformName: "Chrome",
//config level specs will be used
}
]
}