$30 off During Our Annual Pro Sale. View Details »

ぼくのかんがえたさいきょうのE2Eフレームワーク with CodeceptJS

ぼくのかんがえたさいきょうのE2Eフレームワーク with CodeceptJS

未発表作品

tsuemura

June 26, 2019
Tweet

More Decks by tsuemura

Other Decks in Technology

Transcript

  1. ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク

    さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 1 / 25
  2. おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? 末村 拓也( すえむら たくや)

    末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを 物流スタートアップ OPENLOGI で1 年半ほどQA エンジニアを しています しています しています しています しています しています 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ 新卒から5 年ぐらい倉庫でフォークリフト乗り回す生活→いろ いろあってPHPer に→いまはQA エンジニアやってる いろあってPHPer に→いまはQA エンジニアやってる いろあってPHPer に→いまはQA エンジニアやってる いろあってPHPer に→いまはQA エンジニアやってる いろあってPHPer に→いまはQA エンジニアやってる いろあってPHPer に→いまはQA エンジニアやってる                   2 / 25
  3. おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった

    神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった https://qiita.com/tsuemura/items/56ba9942565963858d8f https://qiita.com/tsuemura/items/56ba9942565963858d8f https://qiita.com/tsuemura/items/56ba9942565963858d8f https://qiita.com/tsuemura/items/56ba9942565963858d8f https://qiita.com/tsuemura/items/56ba9942565963858d8f https://qiita.com/tsuemura/items/56ba9942565963858d8f 3 / 25
  4. マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので

    マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので 指摘してください 指摘してください 指摘してください 指摘してください 指摘してください 指摘してください 4 / 25
  5. 何話すの? 何話すの? 何話すの? 何話すの? 何話すの? 何話すの? ぼくのかんがえたさいきょうのE2E フレームワークについて ぼくのかんがえたさいきょうのE2E フレームワークについて

    ぼくのかんがえたさいきょうのE2E フレームワークについて ぼくのかんがえたさいきょうのE2E フレームワークについて ぼくのかんがえたさいきょうのE2E フレームワークについて ぼくのかんがえたさいきょうのE2E フレームワークについて 話します 話します 話します 話します 話します 話します 現時点で一番理想に近いCodeceptJS というフレームワークに 現時点で一番理想に近いCodeceptJS というフレームワークに 現時点で一番理想に近いCodeceptJS というフレームワークに 現時点で一番理想に近いCodeceptJS というフレームワークに 現時点で一番理想に近いCodeceptJS というフレームワークに 現時点で一番理想に近いCodeceptJS というフレームワークに ついても話します ついても話します ついても話します ついても話します ついても話します ついても話します             5 / 25
  6. CodeceptJS とは? CodeceptJS とは? CodeceptJS とは? CodeceptJS とは? CodeceptJS とは?

    CodeceptJS とは? NodeJS 製のE2E テストフレームワーク NodeJS 製のE2E テストフレームワーク NodeJS 製のE2E テストフレームワーク NodeJS 製のE2E テストフレームワーク NodeJS 製のE2E テストフレームワーク NodeJS 製のE2E テストフレームワーク OSS OSS OSS OSS OSS OSS WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ WebDriver やPuppeteer 、Appium などのブラウザ自動操作フ レームワークをラップして、単一のAPI で操作できる レームワークをラップして、単一のAPI で操作できる レームワークをラップして、単一のAPI で操作できる レームワークをラップして、単一のAPI で操作できる レームワークをラップして、単一のAPI で操作できる レームワークをラップして、単一のAPI で操作できる 受け入れテスト(UAT )をそのままテストコードにしたっぽい 受け入れテスト(UAT )をそのままテストコードにしたっぽい 受け入れテスト(UAT )をそのままテストコードにしたっぽい 受け入れテスト(UAT )をそのままテストコードにしたっぽい 受け入れテスト(UAT )をそのままテストコードにしたっぽい 受け入れテスト(UAT )をそのままテストコードにしたっぽい 雰囲気でテストが書ける 雰囲気でテストが書ける 雰囲気でテストが書ける 雰囲気でテストが書ける 雰囲気でテストが書ける 雰囲気でテストが書ける                         6 / 25
  7. 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 感じている不満 感じている不満 感じている不満 感じている不満

    感じている不満 感じている不満 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 安定しない 安定しない 安定しない 安定しない 安定しない 安定しない メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い                   7 / 25
  8. 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 8 / 25

  9. 意味のあるロケータを使いたい 意味のあるロケータを使いたい 意味のあるロケータを使いたい 意味のあるロケータを使いたい 意味のあるロケータを使いたい 意味のあるロケータを使いたい // こう書かざるを得ない // こう書かざるを得ない

    $ $( ('button.btn-primary[type=submit]' 'button.btn-primary[type=submit]') ). .click click( () ) // 本当はこう書きたい // 本当はこう書きたい $ $( (' 送信' ' 送信') ). .click click( () ) クラスとかXPath は要素へのパスでしかなく、テスト的には無意 クラスとかXPath は要素へのパスでしかなく、テスト的には無意 クラスとかXPath は要素へのパスでしかなく、テスト的には無意 クラスとかXPath は要素へのパスでしかなく、テスト的には無意 クラスとかXPath は要素へのパスでしかなく、テスト的には無意 クラスとかXPath は要素へのパスでしかなく、テスト的には無意 味 味 味 味 味 味 ロケータ自身にきちんと意味をもたせたい ロケータ自身にきちんと意味をもたせたい ロケータ自身にきちんと意味をもたせたい ロケータ自身にきちんと意味をもたせたい ロケータ自身にきちんと意味をもたせたい ロケータ自身にきちんと意味をもたせたい 9 / 25
  10. どうしたいのか どうしたいのか どうしたいのか どうしたいのか どうしたいのか どうしたいのか 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい

    文言でロケートしたい 文言でロケートしたい click(' 送信') click(' 送信') click(' 送信') click(' 送信') click(' 送信') click(' 送信') で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ ックされる ックされる ックされる ックされる ックされる ックされる byLinkText() byLinkText() byLinkText() byLinkText() byLinkText() byLinkText() に近いアプローチだが、リンク以外でもそう に近いアプローチだが、リンク以外でもそう に近いアプローチだが、リンク以外でもそう に近いアプローチだが、リンク以外でもそう に近いアプローチだが、リンク以外でもそう に近いアプローチだが、リンク以外でもそう したい したい したい したい したい したい テキストエリアは対応するラベルやプレースホルダでロケー テキストエリアは対応するラベルやプレースホルダでロケー テキストエリアは対応するラベルやプレースホルダでロケー テキストエリアは対応するラベルやプレースホルダでロケー テキストエリアは対応するラベルやプレースホルダでロケー テキストエリアは対応するラベルやプレースホルダでロケー トしたい トしたい トしたい トしたい トしたい トしたい fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') で で で で で で名前 名前 名前 名前 名前 名前というラベルのつい というラベルのつい というラベルのつい というラベルのつい というラベルのつい というラベルのつい たinput に たinput に たinput に たinput に たinput に たinput にすえむら すえむら すえむら すえむら すえむら すえむらが入力される が入力される が入力される が入力される が入力される が入力される                               10 / 25
  11. CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか

    CodeceptJS でどこまでできてるか click(' 送信') click(' 送信') click(' 送信') click(' 送信') click(' 送信') click(' 送信') で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ で送信というテキストを持つボタンがクリ ックされる ックされる ックされる ックされる ックされる ックされる fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') fillField(' 名前', ' すえむら') で で で で で で名前 名前 名前 名前 名前 名前というラベルのつい というラベルのつい というラベルのつい というラベルのつい というラベルのつい というラベルのつい たinput に たinput に たinput に たinput に たinput に たinput にすえむら すえむら すえむら すえむら すえむら すえむらが入力される が入力される が入力される が入力される が入力される が入力される             11 / 25
  12. 実装 実装 実装 実装 実装 実装 ndClickable (クリック可能な要素の探索)の実装 ndClickable (クリック可能な要素の探索)の実装

    ndClickable (クリック可能な要素の探索)の実装 ndClickable (クリック可能な要素の探索)の実装 ndClickable (クリック可能な要素の探索)の実装 ndClickable (クリック可能な要素の探索)の実装 リテラルから探索するために、XPath の合成による泥臭いことを リテラルから探索するために、XPath の合成による泥臭いことを リテラルから探索するために、XPath の合成による泥臭いことを リテラルから探索するために、XPath の合成による泥臭いことを リテラルから探索するために、XPath の合成による泥臭いことを リテラルから探索するために、XPath の合成による泥臭いことを やっている やっている やっている やっている やっている やっている Locator Locator. .clickable clickable = = { { narrow narrow: : literal literal => => xpathLocator xpathLocator. .combine combine( ([ [ `.//a[normalize-space(.)= `.//a[normalize-space(.)=${ ${literal literal} }]` ]`, , `.//button[normalize-space(.)= `.//button[normalize-space(.)=${ ${literal literal} }]` ]`, , `.//a/img[normalize-space(@alt)= `.//a/img[normalize-space(@alt)=${ ${literal literal} }]/ancestor::a` ]/ancestor::a`, , `.//input[./@type = 'submit' or ./@type = 'image' or ./@type = `.//input[./@type = 'submit' or ./@type = 'image' or ./@type = 'button'][normalize-space(@value)= 'button'][normalize-space(@value)=${ ${literal literal} }]` ]`, , ] ]) ), , 12 / 25
  13. 夢 夢 夢 夢 夢 夢 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね

    画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね click(' ゴリラ') click(' ゴリラ') click(' ゴリラ') click(' ゴリラ') click(' ゴリラ') click(' ゴリラ') でゴリラの画像をクリックしてくれるみ でゴリラの画像をクリックしてくれるみ でゴリラの画像をクリックしてくれるみ でゴリラの画像をクリックしてくれるみ でゴリラの画像をクリックしてくれるみ でゴリラの画像をクリックしてくれるみ たいな未来が欲しい たいな未来が欲しい たいな未来が欲しい たいな未来が欲しい たいな未来が欲しい たいな未来が欲しい AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね 文言でのセレクトがもうちょっと賢いといいね 文言でのセレクトがもうちょっと賢いといいね 文言でのセレクトがもうちょっと賢いといいね 文言でのセレクトがもうちょっと賢いといいね 文言でのセレクトがもうちょっと賢いといいね 文言でのセレクトがもうちょっと賢いといいね clickable の対象はa, button, input, label だけなので、div と clickable の対象はa, button, input, label だけなので、div と clickable の対象はa, button, input, label だけなので、div と clickable の対象はa, button, input, label だけなので、div と clickable の対象はa, button, input, label だけなので、div と clickable の対象はa, button, input, label だけなので、div と かspan とかはクリックしてくれない かspan とかはクリックしてくれない かspan とかはクリックしてくれない かspan とかはクリックしてくれない かspan とかはクリックしてくれない かspan とかはクリックしてくれない AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね AI とかでいいかんじにしてくれるといいね                                     13 / 25
  14. 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト

    安定しない(Flaky) テスト 14 / 25
  15. 安定性が悪い(Flaky) 安定性が悪い(Flaky) 安定性が悪い(Flaky) 安定性が悪い(Flaky) 安定性が悪い(Flaky) 安定性が悪い(Flaky) DOM 的には存在するが、他の要素の下に隠れてたりして操作 DOM 的には存在するが、他の要素の下に隠れてたりして操作

    DOM 的には存在するが、他の要素の下に隠れてたりして操作 DOM 的には存在するが、他の要素の下に隠れてたりして操作 DOM 的には存在するが、他の要素の下に隠れてたりして操作 DOM 的には存在するが、他の要素の下に隠れてたりして操作 できない要素との戦い できない要素との戦い できない要素との戦い できない要素との戦い できない要素との戦い できない要素との戦い 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい デフォルトのスクロールはTop or Bottom にしかできない デフォルトのスクロールはTop or Bottom にしかできない デフォルトのスクロールはTop or Bottom にしかできない デフォルトのスクロールはTop or Bottom にしかできない デフォルトのスクロールはTop or Bottom にしかできない デフォルトのスクロールはTop or Bottom にしかできない のでnavbar との相性が悪い のでnavbar との相性が悪い のでnavbar との相性が悪い のでnavbar との相性が悪い のでnavbar との相性が悪い のでnavbar との相性が悪い 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい E2E なのでデータの変更(たとえばブログの記事が増えたり減 E2E なのでデータの変更(たとえばブログの記事が増えたり減 E2E なのでデータの変更(たとえばブログの記事が増えたり減 E2E なのでデータの変更(たとえばブログの記事が増えたり減 E2E なのでデータの変更(たとえばブログの記事が増えたり減 E2E なのでデータの変更(たとえばブログの記事が増えたり減 ったり的なもの)に左右されやすい ったり的なもの)に左右されやすい ったり的なもの)に左右されやすい ったり的なもの)に左右されやすい ったり的なもの)に左右されやすい ったり的なもの)に左右されやすい                               15 / 25
  16. CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか CodeceptJS でどこまでできてるか

    CodeceptJS でどこまでできてるか 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 自動スクロールで要素を真ん中あたりに持ってきてほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい 要素の表示待ちは適宜考慮してほしい データによって可変な領域とそうでない領域を区別してよ データによって可変な領域とそうでない領域を区別してよ データによって可変な領域とそうでない領域を区別してよ データによって可変な領域とそうでない領域を区別してよ データによって可変な領域とそうでない領域を区別してよ データによって可変な領域とそうでない領域を区別してよ しなにやってほしい しなにやってほしい しなにやってほしい しなにやってほしい しなにやってほしい しなにやってほしい                   16 / 25
  17. 実装 実装 実装 実装 実装 実装 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、

    要素の表示待ちも含め、 要素の表示待ちも含め、 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする と と と と と と いうアプローチ いうアプローチ いうアプローチ いうアプローチ いうアプローチ いうアプローチ Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 plugins plugins: : { { retryFailedStep retryFailedStep: : { { enabled enabled: : true true } } } } 17 / 25
  18. 雑感 雑感 雑感 雑感 雑感 雑感 いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた

    いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 「Wait 書くの辛い問題」は、単純なAutoRetry →Fallback で解消 できる できる できる できる できる できる データによって変化する領域をよしなにハンドリングする技 データによって変化する領域をよしなにハンドリングする技 データによって変化する領域をよしなにハンドリングする技 データによって変化する領域をよしなにハンドリングする技 データによって変化する領域をよしなにハンドリングする技 データによって変化する領域をよしなにハンドリングする技 術はなんか出てきてほしい 術はなんか出てきてほしい 術はなんか出てきてほしい 術はなんか出てきてほしい 術はなんか出てきてほしい 術はなんか出てきてほしい スクロール周りはSelenium 側で直してくれるの期待してる スクロール周りはSelenium 側で直してくれるの期待してる スクロール周りはSelenium 側で直してくれるの期待してる スクロール周りはSelenium 側で直してくれるの期待してる スクロール周りはSelenium 側で直してくれるの期待してる スクロール周りはSelenium 側で直してくれるの期待してる Capability にScrollOption 的なの付けてほしいよね Capability にScrollOption 的なの付けてほしいよね Capability にScrollOption 的なの付けてほしいよね Capability にScrollOption 的なの付けてほしいよね Capability にScrollOption 的なの付けてほしいよね Capability にScrollOption 的なの付けてほしいよね 技術的にはCodeceptJS のPlugin としても実装可能なので令 技術的にはCodeceptJS のPlugin としても実装可能なので令 技術的にはCodeceptJS のPlugin としても実装可能なので令 技術的にはCodeceptJS のPlugin としても実装可能なので令 技術的にはCodeceptJS のPlugin としても実装可能なので令 技術的にはCodeceptJS のPlugin としても実装可能なので令 和が終わるころまでにはPR 出したい 和が終わるころまでにはPR 出したい 和が終わるころまでにはPR 出したい 和が終わるころまでにはPR 出したい 和が終わるころまでにはPR 出したい 和が終わるころまでにはPR 出したい                               18 / 25
  19. メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い 19 / 25

  20. 夢 夢 夢 夢 夢 夢 タイムマシン タイムマシン タイムマシン タイムマシン

    タイムマシン タイムマシン ステップごとにDOM のスナップショットをとってくれる ステップごとにDOM のスナップショットをとってくれる ステップごとにDOM のスナップショットをとってくれる ステップごとにDOM のスナップショットをとってくれる ステップごとにDOM のスナップショットをとってくれる ステップごとにDOM のスナップショットをとってくれる 任意の場所からリスタートできる 任意の場所からリスタートできる 任意の場所からリスタートできる 任意の場所からリスタートできる 任意の場所からリスタートできる 任意の場所からリスタートできる 動かなかったところはその場で修正して続きを実行できる 動かなかったところはその場で修正して続きを実行できる 動かなかったところはその場で修正して続きを実行できる 動かなかったところはその場で修正して続きを実行できる 動かなかったところはその場で修正して続きを実行できる 動かなかったところはその場で修正して続きを実行できる                         20 / 25
  21. CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか

    CodeceptJS でどこまで出来てるか タイムマシン タイムマシン タイムマシン タイムマシン タイムマシン タイムマシン       21 / 25
  22. Workaround Workaround Workaround Workaround Workaround Workaround Cypress をつかう Cypress をつかう

    Cypress をつかう Cypress をつかう Cypress をつかう Cypress をつかう CodeceptJS とは無関係のE2E フレームワーク CodeceptJS とは無関係のE2E フレームワーク CodeceptJS とは無関係のE2E フレームワーク CodeceptJS とは無関係のE2E フレームワーク CodeceptJS とは無関係のE2E フレームワーク CodeceptJS とは無関係のE2E フレームワーク ステップごとにDOM のスナップショットを取ってくれる ステップごとにDOM のスナップショットを取ってくれる ステップごとにDOM のスナップショットを取ってくれる ステップごとにDOM のスナップショットを取ってくれる ステップごとにDOM のスナップショットを取ってくれる ステップごとにDOM のスナップショットを取ってくれる リスタートとか編集とかはさすがにできない リスタートとか編集とかはさすがにできない リスタートとか編集とかはさすがにできない リスタートとか編集とかはさすがにできない リスタートとか編集とかはさすがにできない リスタートとか編集とかはさすがにできない クロスブラウザ要らない感じなら使いやすいよ クロスブラウザ要らない感じなら使いやすいよ クロスブラウザ要らない感じなら使いやすいよ クロスブラウザ要らない感じなら使いやすいよ クロスブラウザ要らない感じなら使いやすいよ クロスブラウザ要らない感じなら使いやすいよ                               22 / 25
  23. Workaround Workaround Workaround Workaround Workaround Workaround Allure Reporter を使う Allure

    Reporter を使う Allure Reporter を使う Allure Reporter を使う Allure Reporter を使う Allure Reporter を使う OSS のレポート作成ツール OSS のレポート作成ツール OSS のレポート作成ツール OSS のレポート作成ツール OSS のレポート作成ツール OSS のレポート作成ツール CodeceptJS ももちろんサポートしている CodeceptJS ももちろんサポートしている CodeceptJS ももちろんサポートしている CodeceptJS ももちろんサポートしている CodeceptJS ももちろんサポートしている CodeceptJS ももちろんサポートしている ステップごとにスクリーンショットを取ってくれる ステップごとにスクリーンショットを取ってくれる ステップごとにスクリーンショットを取ってくれる ステップごとにスクリーンショットを取ってくれる ステップごとにスクリーンショットを取ってくれる ステップごとにスクリーンショットを取ってくれる 何をしたときにどう落ちたか分かりやすくて良い 何をしたときにどう落ちたか分かりやすくて良い 何をしたときにどう落ちたか分かりやすくて良い 何をしたときにどう落ちたか分かりやすくて良い 何をしたときにどう落ちたか分かりやすくて良い 何をしたときにどう落ちたか分かりやすくて良い 普通にレポーターとして優秀なのでみんな使ってみてほし 普通にレポーターとして優秀なのでみんな使ってみてほし 普通にレポーターとして優秀なのでみんな使ってみてほし 普通にレポーターとして優秀なのでみんな使ってみてほし 普通にレポーターとして優秀なのでみんな使ってみてほし 普通にレポーターとして優秀なのでみんな使ってみてほし い い い い い い http://allure.qatools.ru/ http://allure.qatools.ru/ http://allure.qatools.ru/ http://allure.qatools.ru/ http://allure.qatools.ru/ http://allure.qatools.ru/ https://demo.qameta.io/allure/ https://demo.qameta.io/allure/ https://demo.qameta.io/allure/ https://demo.qameta.io/allure/ https://demo.qameta.io/allure/ https://demo.qameta.io/allure/                                     23 / 25
  24. あんな夢こんな夢いっぱいあるけど あんな夢こんな夢いっぱいあるけど あんな夢こんな夢いっぱいあるけど あんな夢こんな夢いっぱいあるけど あんな夢こんな夢いっぱいあるけど あんな夢こんな夢いっぱいあるけど みんなみんな誰かが叶えてくれるわけではない みんなみんな誰かが叶えてくれるわけではない みんなみんな誰かが叶えてくれるわけではない みんなみんな誰かが叶えてくれるわけではない

    みんなみんな誰かが叶えてくれるわけではない みんなみんな誰かが叶えてくれるわけではない 欲しい機能があればコミットして世の中を良くしていこう 欲しい機能があればコミットして世の中を良くしていこう 欲しい機能があればコミットして世の中を良くしていこう 欲しい機能があればコミットして世の中を良くしていこう 欲しい機能があればコミットして世の中を良くしていこう 欲しい機能があればコミットして世の中を良くしていこう 24 / 25
  25. おしまい おしまい おしまい おしまい おしまい おしまい 25 / 25