Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
ogawatti
474 views
Spectron
tottoruby32
Engineering
◦
Read more
1
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 48
2
/ 48
3
/ 48
4
/ 48
5
/ 48
6
/ 48
7
/ 48
8
/ 48
9
/ 48
10
/ 48
11
/ 48
12
/ 48
13
/ 48
14
/ 48
15
/ 48
16
/ 48
17
/ 48
18
/ 48
19
/ 48
20
/ 48
21
/ 48
22
/ 48
23
/ 48
24
/ 48
25
/ 48
26
/ 48
27
/ 48
28
/ 48
29
/ 48
30
/ 48
31
/ 48
32
/ 48
33
/ 48
34
/ 48
35
/ 48
36
/ 48
37
/ 48
38
/ 48
39
/ 48
40
/ 48
41
/ 48
42
/ 48
43
/ 48
44
/ 48
45
/ 48
46
/ 48
47
/ 48
48
/ 48
More Related Content
PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
by
Tomohiro Kumagai
ODP
Scala東北紹介
by
Takeda Hiroyuki
PDF
Java8 lambdas chapter1_2
by
yo0824
PDF
Caliban: Functional GraphQL Library for Scala
by
Pierre Ricadat
PDF
Functional JavaScript with Lo-Dash.js
by
Shogo Sensui
PDF
ECMAScript6による関数型プログラミング
by
TanUkkii
PDF
javascript を Xcode でテスト
by
Yoichiro Sakurai
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
by
Tomohiro Kumagai
Scala東北紹介
by
Takeda Hiroyuki
Java8 lambdas chapter1_2
by
yo0824
Caliban: Functional GraphQL Library for Scala
by
Pierre Ricadat
Functional JavaScript with Lo-Dash.js
by
Shogo Sensui
ECMAScript6による関数型プログラミング
by
TanUkkii
javascript を Xcode でテスト
by
Yoichiro Sakurai
これからのJavaScriptー関数型プログラミングとECMAScript6
by
TanUkkii
What's hot
PDF
Trait in scala
by
Yuta Shimakawa
PDF
Phantom Type in Scala
by
Yasuyuki Maeda
PDF
はてなブックマーク in Scala
by
Lintaro Ina
PDF
ScalaプログラマのためのHaskell入門
by
Yasuaki Takebe
PDF
Scalaで型クラス入門
by
Makoto Fukuhara
PDF
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
PDF
Scalaノススメ
by
Yasuyuki Maeda
PDF
MoteMote Compiler Plugin
by
yoshiaki iwanaga
PPTX
JavaScriptクイックスタート
by
Shumpei Shiraishi
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
PDF
OSSから学ぶSwift実践テクニック
by
庸介 高橋
PDF
PHPコードではなく PHPコードの「書き方」を知る
by
Masashi Shinbara
PDF
知って得するC# LINQ to Objects編
by
Shota Baba
PDF
演算子オーバーライドをDSLに活用する
by
kwatch
PDF
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
by
Lintaro Ina
PPTX
HDCLT
by
Daigaku Ando
KEY
Shelly
by
fukamachi
PDF
Why Reactive Matters #ScalaMatsuri
by
Yuta Okamoto
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
PDF
Scala2.8への移行
by
guest5f4320
Trait in scala
by
Yuta Shimakawa
Phantom Type in Scala
by
Yasuyuki Maeda
はてなブックマーク in Scala
by
Lintaro Ina
ScalaプログラマのためのHaskell入門
by
Yasuaki Takebe
Scalaで型クラス入門
by
Makoto Fukuhara
なぜリアクティブは重要か #ScalaMatsuri
by
Yuta Okamoto
Scalaノススメ
by
Yasuyuki Maeda
MoteMote Compiler Plugin
by
yoshiaki iwanaga
JavaScriptクイックスタート
by
Shumpei Shiraishi
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
by
なおき きしだ
OSSから学ぶSwift実践テクニック
by
庸介 高橋
PHPコードではなく PHPコードの「書き方」を知る
by
Masashi Shinbara
知って得するC# LINQ to Objects編
by
Shota Baba
演算子オーバーライドをDSLに活用する
by
kwatch
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
by
Lintaro Ina
HDCLT
by
Daigaku Ando
Shelly
by
fukamachi
Why Reactive Matters #ScalaMatsuri
by
Yuta Okamoto
あなたのScalaを爆速にする7つの方法(日本語版)
by
x1 ichi
Scala2.8への移行
by
guest5f4320
Similar to Spectron
PDF
自己紹介LT「俺の迷走っぷり」
by
Ken Muryoi
ODP
RSpecのここがすごい!
by
mitim
PPTX
ソニーでElectronアプリをリリースしてみた
by
Yasuharu Seki
PDF
ぼく(たち)のかんがえた最新のJS開発環境 #scripty04
by
Yahoo!デベロッパーネットワーク
PDF
Aiming study#6pdf
by
Koutaro Chikuba
PDF
JavaScript/CSS 2015 Autumn
by
Koji Ishimoto
PDF
JS開発におけるTDDと自動テストツール利用の勘所
by
Koji Nakamura
PDF
第7回鹿児島Node.jsの会勉強会資料
by
Koichi Uchimura
PDF
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
by
R S
自己紹介LT「俺の迷走っぷり」
by
Ken Muryoi
RSpecのここがすごい!
by
mitim
ソニーでElectronアプリをリリースしてみた
by
Yasuharu Seki
ぼく(たち)のかんがえた最新のJS開発環境 #scripty04
by
Yahoo!デベロッパーネットワーク
Aiming study#6pdf
by
Koutaro Chikuba
JavaScript/CSS 2015 Autumn
by
Koji Ishimoto
JS開発におけるTDDと自動テストツール利用の勘所
by
Koji Nakamura
第7回鹿児島Node.jsの会勉強会資料
by
Koichi Uchimura
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
by
R S
Spectron
1.
Spectron
2.
自己紹介 Ruby書いてない歴1年ちょっと 最後にまともに書いたのはGrapeでWeb API JavaScript歴だいたい10ヶ月 Lambdaやテストでちょっと書いたことあったくらい 昨年春から某デスクトップアプリ開発へ 優しい先輩から口酸っぱく「テストねぇから!」の脅し
3.
Ruby ‑> JavaScript(Node)
あるある return を書かない > hoge = function hoge() { "hogehoge" } [Function: hoge] > hoge() undefined
4.
0 にハマる > [0, 1,
null].filter(val => { return val }) [ 1 ]
5.
this にハマる NG : thisは呼び出し元===
ary1 convert() { this.ary1.forEach(function(val) { this.ary2.push(this.str2num(val)) }) }
6.
OK : thisを渡す convert()
{ this.ary1.forEach(val => { this.ary2.push(this.str2num(val)) }, this) } OK : Allow functionを使う(thisを語彙的に束縛する) convert() { this.ary1.forEach(val => { this.ary2.push(this.str2num(val)) }) }
7.
非同期処理がまどろこっしい promise/async/awaitは最初の難関 これらがある時代に生まれたのでcallback地獄はさほど経験し なかった Fileの存在チェックで fs.existsSync() ということにむしろ驚く HTTPリクエスト一個送るのも辛い
8.
本題
10.
Spectron Electronアプリのテストフレームワーク(公式) ElectronのAPIをフルサポート 裏側はWebdriver
11.
Electron デスクトップアプリケーションフレームワーク Chromium + Node.js HTML
+ CSS + JavaScript クロスプラットフォーム対応 JS界でのこの分野はまだメジャー (参考)
12.
Electronおさらい とっとるびーでも何度か発表あり(20th, 25th) メインプロセス: Windowを起動したりメニュー操作イベントを受け取ったり Node.js レンダープロセス ブラウザ(HTML +
CSS + JavaScript) をレンダリング Chromium プロセス間通信はipcを用いる。イベントフックしてやり取りする
14.
Electron App your-app/ ├── package.json ├──
main.js └── index.html const { app, BrowserWindow } = require('electron') function createWindow () { win = new BrowserWindow({ width: 800, height: 600 }) win.loadFile('index.html') } app.on('ready', createWindow) $ npm run start
15.
demo https://electronjs.org/blog/simple‑samples https://github.com/electron/simple‑samples
16.
Webdriver
17.
Webdriver ブラウザのテストツール ページ上の要素を操作できる(クリック, 入力等) ページ上の要素の有無や状態をテストできる WebDriverIO ===
WebDriver binding for Node.js
18.
ElectronアプリをSpectronでテストする HTML + CSS
+ JavaScriptで作られたデスクトップアプリを、 WebDriverでテストする。 単純明快で、普通のアプリならテストしやすいよね~と思うじゃないで すか。
19.
例えばslack 入力・表示のテストとか チャンネル切り替えとか 設定変更とか コマンドとか => ブラウザのレンダリング領域のテストは容易 http://webdriver.io/api.html
20.
Demo : npm
runしてテストする https://github.com/electron/spectron#usage electronアプリを起動してWindowの数をテストするだけ
21.
Demo : インストールした.appをテストする 内容は同じ
22.
某PC用アプリケーション Viewerアプリ 初手は画像か動画をメニューから開くところから
23.
メニュー操作
24.
メニュー操作vs Spectron https://github.com/electron/spectron/issues/21 (メニューのテストってどうしたらいいの?)
25.
メニュー操作vs Spectron (メニュー取得するAPIにはまだ対応してしてないよ )
26.
メニュー操作vs Spectron SpectronからElectronアプリケーションのMenuを操作する MenuのAPIがJSONにserializeされていないので、process間通信 が必要なSpectronでは操作が難しいというのがその理由のようで す。 同じ様に、dialogモジュールの操作も出来ません。 アプリケーションの操作をChrome
Driverを通じて行うのが基本理 念のSpectronでは、これらのnativeなAPIを必要とする操作に対す るサポートはまだ不十分、というのが実情です。
27.
spectron‑fake‑menu SpectronはElectronのChrome Driverを通じてアプリケーションの 操作を実行できるのですが、メニューの操作には現状対応していま せん。(詳しくは後述します。) そこでspectron‑fake‑menuというSpectronからメニューの操作が できるnpmを作成しました。 https://github.com/joe‑re/spectron‑fake‑menu
28.
spectron‑fake‑menu でやっていること https://github.com/electron/spectron/issues/94 Electronは‑‑requireオプションで、Electronの起動直前にスクリプ トを差し込むことができます。 これを利用して、Mainプロセスにspectron‑fake‑menu用のイベン トを受け取る口を仕込んでいます。 require('electron').ipcMain.on( 'SPECTRON_FAKE_MENU/SEND', (_e,
labels) => { const item = findItem( require('electron').Menu.getApplicationMenu().items, labels ); item.click(); });
29.
イメージ: spectron‑fake‑menu
30.
続spectron‑fake‑menu つらいところ: メニューの操作は非同期処理になる https://github.com/joe‑re/spectron‑fake‑menu/tree/master/example クリックした後の処理が終わったことを知る術がない HTMLがレンダリングされて、何かしらが変わるのを待つ必要 がある setInterval() & clearInterval() 変わるものがないような処理は・・・sleepのようなものを使 う・・・? メニューの数だけクリックした後の処理終了を待つ関数が必要にな る もちろん共通化できるものもあるが・・・
31.
spectron‑fake‑menu example describe('Increment', function()
{ this.timeout(10000); let app; beforeEach(function() { app = createApplication(); return app.start(); }); afterEach(function() { return app.stop(); }); it('increment count', () => { return app.client.waitForExist('#count') .then(() => { fakeMenu.clickMenu('Count', 'Increment'); return waitForChangeCount(app, '1'); }) .then(() => assert.ok(true)); }); });
32.
waitForChangeCount() export function waitForChangeCount(app,
count) { return new Promise((resolve, _reject) => { const timer = setInterval(() => { app.client.getText('#count').then((text) => { if (text === count) { clearInterval(timer); resolve(); } }); }, 1000); }); }
33.
とは言え、メニュー操作はクリア
34.
しかし 某PCアプリの最初の操作 1. メニュー :
ファイル> 開く 2. ファイル選択のダイアログが開く 3. 画像or 動画を選択する 4. 3が再生される
35.
しかし MenuのAPIがJSONにserializeされていないので、process間通信 が必要なSpectronでは操作が難しいというのがその理由のようで す。 同じ様に、dialogモジュールの操作も出来ません。 同じ様に、dialogモジュールの操作も出来ません。
36.
dialogモジュールのテスト時のモックも同じ理屈ででき る https://github.com/electron/spectron/issues/112 ただしファイルはほぼ固定になる。 テストによってモックを差し替えるようにする等工夫は必要。
37.
後はテストをするだけ Electronアプリは基本的にrenderプロセス側に対する操作駆動 HTMLに対する操作に対するテストを書く WebDriverで大抵カバーできる WebDriverでテストしにくいことはできない
38.
demo SpectronでMenuからファイルを開く
39.
Spectron API ElectronのAPIをフルサポート
40.
アプリの操作, 状態確認 start() stop() restart() isRunning() getSetting()
41.
ログ取得 client.getMainProcessLogs() client.getRenderProcessLogs()
42.
Windowの状態確認 client.getSelectedText() client.getWindowCount() client.waitUntilTextExists(selector, text, [timeout]) client.waitUntilWindowLoaded([timeout]) client.windowByIndex(index)
43.
wait系のAPIが2つしかない WebDriverを使ったことがある人は「待つ」処理がどれだけ必要か分か るはず。 普通にテストを書いていると「xxの処理を待つ」が頻発。 client.waitUntilTextExists(selector, text, [timeout]) client.waitUntilWindowLoaded([timeout]) をラップした便利関数が多数必要になる。 例)
window数がN個になるまで待つ
44.
継続的インテグレーション
45.
Travis CI ### .travis.yml
### before_script: - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" - sleep 3 # give xvfb some time to start
46.
実装例& 一部Demo
47.
まとめ WebDriverを使ったテストが書ける メニュー操作・ダイアログ操作は辛い wait地獄と上手に付き合いましょう CIもできる
Download