electronのUIテストであるspectronのバックエンドのwebdriverioが、v4から v5に更新されました。
呼び出しが非同期に変化して、これまでのメソッドチェーンを使う記法が動作しなくなったため、テストの全面書き直しが必要となります。
webdriverio自体に実践的なサンプルが見つからなかったりして難儀しました。
そのうちspectron公式サイトのトップにサンプルが載っているのを発見。
https://www.electronjs.org/spectron
基本のWindow表示テストですが、v4のテストコードを引き写してきた覚えのある手元の同等テストとはあれこれ違う感じです。
引き写したというのはREADME.md のmochaも使ったテストで、これ自体はv5環境下でも動作します。
https://github.com/electron-userland/spectron
ここでは、v5対応の準備運動代わりに、サンプルにいろいろ追加してみました。
## CIテストに組み込むのでパスを固定値から自動判定に変更したい
```
const electronPath = require('electron') // Require Electron from the binaries included in node_modules.
const path = require('path')
var app = new Application({
//path: '/Applications/MyApp.app/Contents/MacOS/MyApp'
path: electronPath,
args: [path.join(__dirname, '..')]
})
```
## assert()でエラーを検出した場合に、最終的に自動で停止してほしい
エラーが起こってcatch節に落ちると、Ctrl+CでKillするまでターミナルに帰ってこない。
ローカルのターミナルでテストしている限りは少し不便なだけだが、このままではCIに都合が悪い(いずれタイムアウトするだろうが、早く終わらせてエラー通知させたい)。
catch節に落ちた際に、能動的に`app.stop()`を呼ぶことでテストが終了しターミナル操作が帰ってくる。
```
return app.stop()
}).catch(function (error) {
// Log any failures
console.error('Test failed', error.message)
app.stop() // ++ exit test and return to terminal control.
})
```
## assert()でエラーを検出した場合に、ターミナルにエラーコードを返す
サンプルコードのままでは、ターミナルへの戻り値がゼロになっており、CIでエラー検出できない。
これはassert()ではやらず、タイムアウトで実現した。
mochaテストフレームワークに、非同期テストのために 「done()を呼ばないとタイムアウトになる」という仕組みがあるので、それを利用した。
```
it("Test for Window", function(done){ // ++ In mocha testing framework
app.start().then(function () {
~
}).then(function () {
// Stop the application
done(); // ++ Test result to Success
return app.stop()
}).catch(function (error) {
// Log any failures
console.error('Test failed', error.message)
app.stop()
// done(); // ++ Test result `not done()` is Failure, of timeout when catched error.
})
}).timeout(4000); // ++ Optional timeout msec (default 2000)
```
実行結果:
```
MN@daisy-bell:lina_dicto/$ ARG=wakeup make test
cd lina_dicto && npm run test test/wakeup
> lina_dicto@0.2.11 test /home/nuka/lina_dicto/lina_dicto
> mocha --require intelli-espower-loader "test/wakeup"
Test failed # test/wakeup.js:26
assert.equal(title, "lina_dicto - Esperanto / Japanese -xx")
|
"lina_dicto - Esperanto / Japanese -"
1) window
0 passing (2s)
1 failing
1) window:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/nuka/lina_dicto/lina_dicto/test/wakeup.js)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! lina_dicto@0.2.11 test: `mocha --require intelli-espower-loader "test/wakeup"`
~
MN@daisy-bell:lina_dicto/$ echo $?
2
```
0 件のコメント:
コメントを投稿