テストスイートの整理
プロジェクトが成長するにつれて、必然的に統合テストがどんどん追加されていきます。これによりビルド時間が増加し、生産性が低下します。
これを防ぐために、テストを並行して実行する必要があります。WebdriverIOは既に各スペック(またはCucumberの場合は_フィーチャーファイル_)を単一セッション内で並行してテストします。一般的には、1つのスペックファイルで単一の機能のみをテストするようにしましょう。1つのファイルに多すぎるテストや少なすぎるテストを入れないようにしましょう(ただし、これに関しては黄金律はありません)。
テストがいくつかのスペックファイルを持つようになったら、テストを同時に実行し始めるべきです。そのためには、設定ファイルのmaxInstances
プロパティを調整します。WebdriverIOでは、ファイルやテストがいくつあっても、すべて並行して実行できる最大同時実行性でテストを実行できます(ただし、コンピュータのCPU、同時実行の制限などの制約があります)。
例えば、3つの異なる機能(Chrome、Firefox、Safari)があり、
maxInstances
を1
に設定した場合、WDIOテストランナーは3つのプロセスを生成します。したがって、10個のスペックファイルがあり、maxInstances
を10
に設定すると、_すべての_スペックファイルが同時にテストされ、30のプロセスが生成されます。
すべてのブラウザに対して属性を設定するために、maxInstances
プロパティをグローバルに定義できます。
独自のWebDriverグリッドを実行している場合、あるブラウザが他のブラウザよりも多くの容量を持っているかもしれません。その場合、capability オブジェクトでmaxInstances
を_制限_することができます:
// wdio.conf.js
export const config = {
// ...
// すべてのブラウザに対してmaxInstanceを設定
maxInstances: 10,
// ...
capabilities: [{
browserName: 'firefox'
}, {
// maxInstancesはcapabilityごとに上書きできます。したがって、社内のWebDriverグリッドに
// 利用可能なfirefoxインスタンスが5つしかない場合、一度に5つ以上のインスタンスが
// 起動されないようにすることができます。
browserName: 'chrome'
}],
// ...
}
メイン設定ファイルから継承する
複数の環境(例:開発環境と統合環境)でテストスイートを実行する場合、複数の設定ファイルを使用すると管理しやすくなります。
ページオブジェクトの概念と同様に、最初に必要なのはメイン設定ファイルです。これには環境間で共有するすべての設定が含まれています。
次に、各環境用の別の設定ファイルを作成し、メイン設定を環境固有のものと補完します:
// wdio.dev.config.js
import { deepmerge } from 'deepmerge-ts'
import wdioConf from './wdio.conf.js'
// デフォルトとしてメイン設定ファイルを持ちますが、環境固有の情報を上書きします
export const config = deepmerge(wdioConf.config, {
capabilities: [
// より多くのcapsがここで定義されます
// ...
],
// ローカルではなくSauce Labsでテストを実行
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,
services: ['sauce']
}, { clone: false })
// 追加のレポーターを追加
config.reporters.push('allure')
スイートでテストスペックをグループ化する
テストスペックをスイートでグループ化し、すべてのスペックではなく特定のスイートのみを実行することができます。
まず、WDIOの設定でスイートを定義します:
// wdio.conf.js
export const config = {
// すべてのテストを定義
specs: ['./test/specs/**/*.spec.js'],
// ...
// 特定のスイートを定義
suites: {
login: [
'./test/specs/login.success.spec.js',
'./test/specs/login.failure.spec.js'
],
otherFeature: [
// ...
]
},
// ...
}