Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ぼくのかんがえたさいきょうの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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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












    5 / 25

    View Slide

  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

    View Slide

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


















    7 / 25

    View Slide

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

    View Slide

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






    ロケータ自身にきちんと意味をもたせたい
    ロケータ自身にきちんと意味をもたせたい
    ロケータ自身にきちんと意味をもたせたい
    ロケータ自身にきちんと意味をもたせたい
    ロケータ自身にきちんと意味をもたせたい
    ロケータ自身にきちんと意味をもたせたい
    9 / 25

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide







  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

    View Slide

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

    View Slide

  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

    View Slide

  16. CodeceptJS
    でどこまでできてるか
    CodeceptJS
    でどこまでできてるか
    CodeceptJS
    でどこまでできてるか
    CodeceptJS
    でどこまでできてるか
    CodeceptJS
    でどこまでできてるか
    CodeceptJS
    でどこまでできてるか

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    自動スクロールで要素を真ん中あたりに持ってきてほしい

    要素の表示待ちは適宜考慮してほしい

    要素の表示待ちは適宜考慮してほしい

    要素の表示待ちは適宜考慮してほしい

    要素の表示待ちは適宜考慮してほしい

    要素の表示待ちは適宜考慮してほしい

    要素の表示待ちは適宜考慮してほしい

    データによって可変な領域とそうでない領域を区別してよ

    データによって可変な領域とそうでない領域を区別してよ

    データによって可変な領域とそうでない領域を区別してよ

    データによって可変な領域とそうでない領域を区別してよ

    データによって可変な領域とそうでない領域を区別してよ

    データによって可変な領域とそうでない領域を区別してよ
    しなにやってほしい
    しなにやってほしい
    しなにやってほしい
    しなにやってほしい
    しなにやってほしい
    しなにやってほしい


















    16 / 25

    View Slide

  17. 実装
    実装
    実装
    実装
    実装
    実装
    要素の表示待ちも含め、
    要素の表示待ちも含め、
    要素の表示待ちも含め、
    要素の表示待ちも含め、
    要素の表示待ちも含め、
    要素の表示待ちも含め、 失敗したらちょっと待ってリトライする
    失敗したらちょっと待ってリトライする
    失敗したらちょっと待ってリトライする
    失敗したらちょっと待ってリトライする
    失敗したらちょっと待ってリトライする
    失敗したらちょっと待ってリトライする と





    いうアプローチ
    いうアプローチ
    いうアプローチ
    いうアプローチ
    いうアプローチ
    いうアプローチ
    Plugin
    で実現
    Plugin
    で実現
    Plugin
    で実現
    Plugin
    で実現
    Plugin
    で実現
    Plugin
    で実現
    plugins
    plugins:
    : {
    {
    retryFailedStep
    retryFailedStep:
    : {
    {
    enabled
    enabled:
    : true
    true
    }
    }
    }
    }
    17 / 25

    View Slide

  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

    View Slide

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

    View Slide







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
























    20 / 25

    View Slide

  21. CodeceptJS
    でどこまで出来てるか
    CodeceptJS
    でどこまで出来てるか
    CodeceptJS
    でどこまで出来てるか
    CodeceptJS
    でどこまで出来てるか
    CodeceptJS
    でどこまで出来てるか
    CodeceptJS
    でどこまで出来てるか

    タイムマシン

    タイムマシン

    タイムマシン

    タイムマシン

    タイムマシン

    タイムマシン






    21 / 25

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide