Slide 1

Slide 1 text

ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた ぼくのかんがえた さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク さいきょうのE2E フレームワーク with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS with CodeceptJS 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 末村 拓也 @ 株式会社オープンロジ 1 / 25

Slide 2

Slide 2 text

おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 末村 拓也( すえむら たくや) 物流スタートアップ 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

Slide 3

Slide 3 text

おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? おまえ誰? 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 神龍に自動テストを作ってもらう記事で一瞬有名人になった 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

Slide 4

Slide 4 text

マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイクの存在を忘れがちなので、 マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので マイク持つの忘れたらLT 中でもいいので 指摘してください 指摘してください 指摘してください 指摘してください 指摘してください 指摘してください 4 / 25

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 既存のテスティングフレームワークに 感じている不満 感じている不満 感じている不満 感じている不満 感じている不満 感じている不満 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 安定しない 安定しない 安定しない 安定しない 安定しない 安定しない メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い                   7 / 25

Slide 8

Slide 8 text

意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 意味のないロケータ 8 / 25

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

どうしたいのか どうしたいのか どうしたいのか どうしたいのか どうしたいのか どうしたいのか 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい 文言でロケートしたい 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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

実装 実装 実装 実装 実装 実装 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

Slide 13

Slide 13 text

夢 夢 夢 夢 夢 夢 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 画像も画像認識でセレクトできると最高だよね 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

Slide 14

Slide 14 text

安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 安定しない(Flaky) テスト 14 / 25

Slide 15

Slide 15 text

安定性が悪い(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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

実装 実装 実装 実装 実装 実装 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、 要素の表示待ちも含め、 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする 失敗したらちょっと待ってリトライする と と と と と と いうアプローチ いうアプローチ いうアプローチ いうアプローチ いうアプローチ いうアプローチ Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 Plugin で実現 plugins plugins: : { { retryFailedStep retryFailedStep: : { { enabled enabled: : true true } } } } 17 / 25

Slide 18

Slide 18 text

雑感 雑感 雑感 雑感 雑感 雑感 いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた いままで多くのテスト自動化エンジニアを苦しめてきた 「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

Slide 19

Slide 19 text

メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い メンテナンス・デバッグ効率が悪い 19 / 25

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか CodeceptJS でどこまで出来てるか タイムマシン タイムマシン タイムマシン タイムマシン タイムマシン タイムマシン       21 / 25

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

おしまい おしまい おしまい おしまい おしまい おしまい 25 / 25