Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Selenium勉強会
Search
arm4
October 13, 2017
Programming
0
670
Selenium勉強会
10/12社内で開催したSelenium勉強会で使用したスライド
arm4
October 13, 2017
Tweet
Share
More Decks by arm4
See All by arm4
Google Data Studio 101
fromarm4
0
110
5 Points Of Customizing Vuetify
fromarm4
4
1.2k
about abstract component design using slots of Vue.js
fromarm4
4
1.4k
laravel_lt_party_with_mokumoku_3
fromarm4
0
350
Make it happen in realtime with Laravel Echo and Pusher
fromarm4
0
940
Trying to write a code with Laravel+Vue+TypeScript
fromarm4
0
470
Create a Laravel notification via Slack when batch jobs are finished
fromarm4
0
700
solving frontend issues
fromarm4
1
1.5k
Popular Vue.js UI Frameworks in 2019
fromarm4
2
830
Other Decks in Programming
See All in Programming
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
480
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
Remix on Hono on Cloudflare Workers
yusukebe
1
300
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
120
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
1
200
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.3k
카카오페이는 어떻게 수천만 결제를 처리할까? 우아한 결제 분산락 노하우
kakao
PRO
0
110
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.2k
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
距離関数を極める! / SESSIONS 2024
gam0022
0
290
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
Featured
See All Featured
Designing Experiences People Love
moore
138
23k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Unsuck your backbone
ammeep
668
57k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
[RailsConf 2023] Rails as a piece of cake
palkan
52
4.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Transcript
Selenium 勉強会 arm4
今日、話すこと そもそもテストって何? Laravel のテスト Selenium 概要&環境構築手順 テスト実行デモンストレーション Selenium コード実装時の注意事項 Laravel
でPHPUnit を書く時の注意事項 PHPUnit (Laravel テスト)との比較
そもそもテストって 何?
単体テスト クラスや関数といった単位のプログラムのテスト 結合テスト 単体テストで検証したプログラムを組みわせて行う テスト 機能テスト 結合したプログラムを1 つの機能として行うテスト システムテスト 個々のプログラムや機能を結合したプログラムが仕
様通りに動くかを検証するためのテスト https://qiita.com/ktarow/items/8c3d94d6c21a0c86b79
いきなりいっぱいある!! 難しい専門用語ばっかり!! 正直、面倒くさそうwww テストばっか書いてられないし。。 こんなに大それたテストじゃなくていいか ら、普通に人間がテストしてるようなのを自 動でやってくれないかな。
たとえば、面倒なテストって言えば.... 広範囲に影響がある共通メソッドをいじったから全 ページ落ちてないか確認。 GET のパラメによって表示する内容が変わる系ペー ジの全パターン網羅。 とりあえず一通りの保存編集削除が壊れてないか確 認。
だいたいこういうテストは何パターンかやったら、 「うん。よさそうだな。」になる。 だいたいバグ報告は、こういう「うん。よさそうだ な。」から漏れてる箇所。 だいたい「え?そこ?」みたいな斜め上からやって くる。 あーーーこんな簡単で面倒な テスト誰か代わりにやってく れないかなー。
それ、あるよ! E2E テスト
E2E テスト E2E とはEnd to End の略。Face to Face の友達。
端から端までテストするよという意味。
より狭義的に言うと コードを使ってブラウザを操作し、ユーザが実際に操 作するのと同じことを再現するテストのこと。 ブラウザテストとも呼ばれる。 要するに私たちが普段、手で やってるテスト!!!!
ブラウザテストツールはこんなにっ★ ブラウザテストツール総まとめ・2016 年夏版 https://qiita.com/cognitom/items/6cce719b57341769c
ベル子の優しいまとめ ヘッドレスブラウザを使ったテスト Selenium を使ったテスト この2種類があるって覚えて おけばおk
ヘッドレスブラウザを使った テスト リアルなブラウザとは違うので挙動がちょっと違う こともある GUI がないからテストの実行速度が速い GUI がないからLinux でも安心
Selenium を使ったテスト リアルなブラウザのエンジンを使うので挙動での差 がない GUI があるからテストの実行速度がやたら遅い GUI があるからLinux では頑張らないと使えない
現状では、挙動での差がないSelenium を選択する現 場が多いようです。
Laravel のテスト
PHPUnit というテスティングフレームワークをベー スにLaravel が使いやすいように、いろいろ施したや つ。 PHPUnit を使う上で押さえておきたい知識 PHPUnit の主なAssert メソッド一覧
http://www.dn- web64.com/archives/web/phpunit_knowledge/ https://qiita.com/rev84/items/12fbd16d210d6a86eff9
実は、Laravel のテストを使えば、 単体テスト、結合テスト、機能テスト、システムテス トをひと通り書ける。 と、思う。 ↓詳しくはこちら https://laravel.com/docs/5.2/testing
こんな感じでページのクローリングもできる。 // public function testTimeline() { $this->visit('/timeline') ->seePageIs('/timeline') ->see(' ');
}
あれ?それなら Selenium 必要ないん じゃね?
ただ、Laravel のテ ストには致命的な問 題が存在してい た!!
JavaScript が理解で きないお(´ ・ω ・`)
JavaScript が理解できない イコール、Vue.js が書き出すhtml が読めない イコール、Vue.js が死んでて何も表示されな くても分からない イコール、モーダルで何かやってるやつ系全 部ムリ
イコール、ajax で何かやってるやつもムリ
Selenium 概要&環境構築手順
超訳Selenium 概要 https://www.kaitoy.xyz/2017/07/12/2017-selenium- headless-browsers/ ブラウザテスト創世記にはこうある。 神は「光あれ」と言われた。するとSelenium があった。 神はその光を見て、良しとされた。神はその光と闇とを分けられ た。 神は光をSelenium
RC (aka Selenium 1) と名づけ、闇を Selenium WebDriver (aka Selenium 2) と名づけられた。
ちゃんとしたSelenium 概要 Selenium の原型は2004 年に誕生し、いろいろな経 緯があってSelenium RC (Selenium 1 )が誕生。
Selenium RC はJava やPython などの言語で書いたス クリプトを元に、 JavaScript を生成しそれをテスト ページに埋め込んでブラウザを操作するという仕組 みだったので、 ブラウザのセキュリティ制限によ って多くの動作制約を受けた。 そこで、すごい人がネイティブなブラウザ機能ある いはブラウザ拡張を用いてブラウザを直接操作する 仕組みを模索し始める。
2007 年、WebDriver の開発が始動。 2011 年7 月、Selenium RC とWebDriver を統合し た、Selenium
WebDriver (Selenium 2 )がリリー ス。 現在、Selenium のバージョンは3 。 3 は2 の単なるバグフィックス。 3 ではSelenium RC のAPI はサポートされなくなっ た。 現在、WebDriver のAPI はW3C で標準化が進められ ている。
ドライバを使ってブラウザを 動かす方法 RESTful API(JSON Wire Protocol) に従いHTTP リクエ ストを発行し、返って来たレスポンスを解釈して用途 に合わせてまたHTTP
リクエストを発行するというよ うな仕組みになっている。 https://app.codegrid.net/entry/selenium-1
そんな難しいこと知 ったこっちゃない。 大丈夫、Selenium 公式がサポートしているクライア ントのライブラリがあるYO ★
対応言語 Java Ruby Python C# JavaScript(Node.js)
でたーーwww PHP がないwwww
大丈夫!! Facebook 様がライブラリ作っ てくれたよ! でも、非公式言語だから、Selenium Server Standalone という別言 語からでもアレできる何かを入れる必要があるの☆メンゴ
Selenium WebDriver はAPI を介してブラウザを直接操 作するため、ブラウザ毎にドライバーが用意されてい る。 使いたいドライバーが複数あれば全てインストールし なければならない。 Firefox, GeckoDriver
Chrome, ChromeDriver MS Edge, Microsoft WebDriver
すごくてうれしいまとめ Selenium とは... ある特定の単体ライブラリの名称ではない。 WebDriver を使ったブラウザを自動操作して行うテ スト環境(エコシステム)全体のこと。
詳しい導入手順(お手製) https://qiita.com/Arm4/items/92ef786378b544c7ffe4
Laravel に自力で facebook/php-webdriver (以 下phpdriver )を入れるコツ
phpdriver はphpunit のバージョンをrequire してい るため、各OSS のgithub ページのcomposer.json を 確認し、全員に怒られないバージョンを特定し記述 する必要がある。
Laravel 以外のフレームワークもComposer.json を使 用していれば、だいたい要領は同じ。
Laravel のcomposer.json これのbranch を切り替えればそれぞれの composer.json の確認ができる。 https://github.com/laravel/laravel/blob/master/com
phpdriver のcomposer.json phpdriver のほうはTag でバージョン管理してるよう なので、タブをTags にしてそちらで切り替えて確認。 https://github.com/facebook/php- webdriver/blob/community/composer.json
参考 Composer のバージョン指定方法でのチルダ(~ )と キャレット(^ )の違い http://blog.a-way- out.net/blog/2015/06/19/composer-version-tilde- and-caret/
テスト実行デモンストレーシ ョン
selenium-server はデフォルトでポート4444 で立ち上 がるので、コード内でlocalhost:4444 と指定している 人はポートを指定する必要はない。 selenium-server
アプリルートで実行 ./vendor/bin/phpunit tests/BrowserTest.php
Selenium コード実装時の注意 事項
操作したいHTML 要素がロードされるまで待って から操作を始めないといけない ファーストビューで見えない位置にある要素をクリ ックしようとするとエラーが出るので、コードでス クロールさせないといけない Laravel のDebug Bar がじゃまで一番下の要素のク
リックができないのでテストの前には APP_DEBUG=false に
本当にブラウザを立ち上げて自動で操作しているだ けなので、コード上でAPP_ENV=testing にしても 効いてくれない テスト時のみサブドメインを設定して config/app.php で判定させてみたが、テスト実行時 にエラーが出てしまう。 うまい解決法が見つかっていない。 'env'
=> strpos(url('/'), 'http://testing.') !== false ? 'test
Chrome だとgetText だとうまくテキストが取得でき ない場合があるのでgetAttribute("innerText") でテ キストを取得する $element = $this->driver->findElement(WebDriverBy::cssSel return
$element->getAttribute("innerText");
Select2 の入力時などinput 入力にJS が絡んでくる場 合、最後にenter を付け加えてやるとうまくいく // 選択 $element =
$this->findBySelector('.visions-group-member-s $action->moveToElement($element)->click()->perform(); $this->driver->findElement(WebDriverBy::cssSelector(".vis
Ajax を使ったDB へのデータ追加を伴う処理のあ と、リダイレクトでページが表示されてすぐに、ま たDB 操作をしたりするとデータがないと怒られる ため、sleep させるなどして適度に待ってやらない といけない
Laravel でPHPUnit を書く時の 注意事項
Laravel でsetUp を使う場合は継承の関係上、このよう に書かないといけない。 public function setUp(){ parent::setUp(); }
PHPUnit (Laravel テスト)と の比較
PHPUnit Selenium テストコードが何をやっ てるか 分かりに くい 分かりや すい Vue.js のコンポーネント
テスト × ◦ ajax を使った保存テスト △ ◦ モーダルを使ったUI のテ スト × ◦
PHPUnit Selenium .env.testing の利用 ◦ × API の返すjson レスポンス の検証
◦ × メソッド単位のテスト ◦ × 数値比較テスト ◦ △ バリデーションのテスト ◦ △
参考 【Laravel 】フォームリクエストバリデーションのテ ストコード作成 https://qiita.com/n_mogi/items/57a946205df2a69889c
ここまで話しておい て何ですが....
Laravel 5.4 からLaravel のテス ト仕様が大幅に変更になりま した。
Why? いくらページのクロールができたとしても、 JavaScript が理解できないとJS フレームワークを利 用したサイトでのテストは難しい。 Selenium 環境を構築するのって面倒 Selenium でテストできたら、
事実上、PHPUnit のほうでアプリケーションテス ト(システムテスト)をする必要がない。
Laravel の出した結論 単体テスト PHPUnit でやりましょう。(Unit) 結合テスト PHPUnit でやりましょう。(Laravel では定義されて ないが、Unit
に入れるのがよさげ) 機能テスト PHPUnit でやりましょう。(Feature)
システムテスト Selenium でやりましょう。 Laravel が使いやすいライブラリを作っておきまし た。 https://laravel.com/docs/5.5/dusk
API テスト PHPUnit でやりましょう。 Laravel が使いやすいメソッドを作っておきまし た。 https://laravel.com/docs/5.5/http-tests
詳しくはこちらをどうぞ https://laravel.com/docs/5.5/testing
ご清聴ありがとうご ざいました★