Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

テストを自動化するのをやめ、自動テストを作ろう

 テストを自動化するのをやめ、自動テストを作ろう

July Tech Festa 2020 TrackB https://jtf2020.peatix.com/

tsuemura

July 25, 2020
Tweet

More Decks by tsuemura

Other Decks in Technology

Transcript

  1. 末村 拓也 (すえむら たくや) Twitter: @tsueeemura Autify テスト⾃動化スペシャリスト 開発者 兼

    サポート 兼 エバンジェリスト 現場猫 → 底辺PHPer → QAエンジニア → 現職 CodeceptJS コントリビュータ SoftwareDesign誌 6〜8⽉号『はじめよう,⾼速 E2Eテスト』
  2. ⼿動テストを⾃動化するとたくさんの観点が失われる # ログインページ ## ログインできる 1. URL /login にアクセスする 2.

    ユーザー名に takuya と⼊⼒する 3. パスワードに insecure と⼊⼒する 4. ログインボタン をクリックする 5. ホーム画⾯ が表⽰されることを確認
  3. describe('ログインページ', () => { it('ログインできる', () => { browser.get('/login') //

    URL /login にアクセスする $('#username').setValue('takuya') // ユーザー名に takuya と⼊⼒する $('#password').setValue('insecure') // パスワードに insecure と⼊⼒する $('a.btn.btn-primary').click() // ログインボタン をクリックする assert.equal(browser.url, '/home') // ホーム画⾯が表⽰されることを確認 }) }) ロケータ(要素探索のキー)がセマンティックじゃなくなった ユーザー名を⼊れるフィールドっぽいやつ → #username ログインボタンっぽいやつ → a.btn.btn-primary アサーション(検証)が弱くなった ホーム画⾯っぽいページ → /home というURLである
  4. 素朴なテスト⾃動化は部分的な変化のみをもたらす - ⼿動テスト テスト⾃動化 ⾃動テスト 開発サイクル 開発とは別 開発とは別 開発と同時 頻度

    少 少 多 実⾏⼿順 あいまい・暗黙的 厳密・具体的 厳密・具体的 検証⽅法 発⾒的 保証的 保証的 太字は⾃動化によって変わってしまうもの ⾚字は⾃動化しても残り続けるもの
  5. (再掲)⼿動テストとテスト⾃動化、そして⾃動テストの違い - ⼿動テスト テスト⾃動化 ⾃動テスト 開発サイクル 開発とは別 開発とは別 開発と同時 頻度

    少 少 多 実⾏⼿順 あいまい・暗黙的 厳密・具体的 厳密・具体的 検証⽅法 発⾒的 保証的 保証的 太字は⾃動化によって変わってしまうもの ⾚字は⾃動化しても残り続けるもの
  6. ⼿動テスト最適化 機能1 機能2 機能3 ログイン 機能1 ログイン 機能2 ログイン 機能3

    機能1の データ作成 機能1, 2の データ作成 ログイン ログアウト ログイン ログアウト ⾃動テスト最適化 テスト⽤の ユーザー作成 事前準備 実⾏ 事後処理 機能1の データ作成 テストデータの 削除
  7. 参考: テスト⾃動化の8原則 1. ⼿動テストはなくならない 2. ⼿動でおこなって効果のないテストを⾃動化しても無駄である 3. ⾃動テストは書いたことしかテストしない 4. テスト⾃動化の効⽤はコスト削減だけではない

    5. ⾃動テストシステムの開発は継続的におこなうものである 6. ⾃動化検討はプロジェクト初期から 7. ⾃動テストで新種のバグが⾒つかることは稀である 8. テスト結果分析という新たなタスクが⽣まれる https://sites.google.com/site/testautomationresearch/test_automation_principle
  8. 参考: テスト⾃動化の8原則 7. ⾃動テストで新種のバグが⾒つかることは稀である 運⽤に乗った⾃動テストは基本的に「枯れた」テストケースを対象とするため、 ほとんどの種類のバグはテストケースを枯らす過程、あるいは⾃動テストを実装 する過程で既に⼈間によって発⾒されているはずである。 多くの運⽤に乗った⾃ 動テストの意義は「⼀度動いたはずの機能がうっかり壊れる」ことを最速で発⾒ することにある。

    ただし、⼿順が同じでデータの種類が膨⼤なテストを⾃動化す る場合、ファジング、テストパターンを有機的に⽣成できるAPIレイヤのテスト、 ブラウザやRDBなどのバージョンアップの影響を受けていないことを確認するテ ストなど、いくつかの例外もある。 (太字は発表者によるもの)
  9. 「ふんわり ≒ ⼿動テストよりの」⾃動テスト - ⼿動(ふんわり)テスト テスト⾃動化 ⾃動(かっちり)テスト 開発サイクル 開発とは別 開発とは別

    開発と同時 頻度 少 少 多 実⾏⼿順 あいまい・暗黙的 厳密・具体的 厳密・具体的 検証⽅法 発⾒的 保証的 保証的
  10. ふんわりしたロケータ(1) セマンティックロケータ ⽂⾔や構造による「意味のある」ロケータ #username ではなく ユーザー名 のように表⽰されている⽂⾔で指定 例えばinputならラベルやプレースホルダを使う xxという⽂⾔を持つモーダルの中のyyというボタン のようなUI構造で指定

    // CodeceptJSでは⽂⾔や構造による指定をサポートしている I.click('ユーザー名') // 「本当に送信しますか︖」という⽂⾔のあるモーダルの中から within(locate('.modal'.withText('送信先は間違いありませんか︖'), () => { // 「はい」と「送信」をクリック I.click('はい') I.click('送信') })
  11. ID: not matched class: matched alter text: matched coodinate: not

    matched image source: matched .... Confidence: 80% ふんわりしたロケータ(2) AIによる要素探索 (マルチロケータ、 セルフヒーリング) 複数のロケータで複合的に探索 ⾒つかった要素の特徴でシナリ オをアップデート 開発サイクルとテストのサ イクルのズレを吸収