Slide 1

Slide 1 text

テスト自動化ことはじめ 末村 拓也 @ Autify, Inc. 2024-12-12 オープンロジ凱旋公演

Slide 2

Slide 2 text

誰 末村 拓也 X: @tsueeemura Quality Evangelist at Autify, Inc. 開発からマーケティングまで全部やる方のフルスタ ックエンジニア テトリスとメカニカルキーボードが好き ex-OPENLOGI

Slide 3

Slide 3 text

思い出と略歴

Slide 4

Slide 4 text

略歴(1) 新卒〜エンジニア転身 2010年ぐらい 文系大学卒業後、ギリギリ内定が出た文具問屋に入社 総合職採用で「営業と倉庫どっちがいい?」と言われ、営業が嫌なので倉庫へ 後に倉庫が「営業で成績が出なかった人の受け皿」なのを知る 毎朝3時間ぐらいExcel作業があってキレたのでVBAで自動化、10分で終わるように なる 2015年ぐらい 味をしめてエンジニア転身 もともとは事業マネージャーとしての採用だったが、色々ありPHPコードのメンテ ナンスをするように 開発環境が無く、ステージングで修正して本番にコピペするデプロイにキレたので Git入れたり色々改善

Slide 5

Slide 5 text

略歴(2) 物流スタートアップ 2017年ぐらい 「物流ドメイン知識とITスキルがあるな……」などと考えながら職探しを していたら偶然にも某物流スタートアップを見つけて転職 最初は倉庫を回るのが仕事だったが、徐々にQAに軸足を映す モダンな開発文化をたくさん知り、エンジニア人生の礎となった

Slide 6

Slide 6 text

余談 - サイコパス疑惑

Slide 7

Slide 7 text

略歴 (3) バズり〜Autify転職 バズった 我が名は神龍……どんなテストもひとつだけ自動化してやろう #JavaScript - Qiita これが名刺代わりになり色んなイベントに参加・登壇するように QAの友達が増えた 夜中にTwitter見てたらテスト自動化エンジニアの募集が ノリで応募したら受かってしまった 当初は自分含めて5人だけ

Slide 8

Slide 8 text

略歴(4) フルスタックエンジニアへの道 初期はしっちゃかめっちゃかで、プリセールスから開発、サポートまでなんでもござれ その後徐々にテクニカルサポートに軸足を移す 自動テストあるあるの「なぜか動かない」にひたすらパッチを当てる作業 地味だが、競合優位となるmoat(堀)を作る重要な役目 後にQAになるが、開発チームが優秀すぎて「あれ、これQA要らなくね?」となり離脱 現在はマーケティングに軸足を置きつつ、再び何でも屋に

Slide 9

Slide 9 text

Slide 10

Slide 10 text

テスト自動化実践ガイド 2024/7/31発売 三部構成で、テスト自動化を 始める前から運用まで広くカバー 第1部 自動テストに取り組む前に 第2部 アプリケーションにE2Eテ ストを導入する 第3部 自動テストを改善するテク ニック

Slide 11

Slide 11 text

第1部 自動テストに取り組む前に 第1章 テストの目的 第2章 開発を支える自動テスト 第3章 見つけたいバグを明確にする 第4章 E2Eテストとは何か

Slide 12

Slide 12 text

第2部 アプリケーションにE2Eテ ストを導入する 第5章 サンプルアプリケーションのセッ トアップ 第6章 最小限のテストをデプロイする 第7章 ビジネスプロセスをカバーするテ ストを作成する 第8章 ユーザーストーリーをカバーする テストを作成する 第9章 テストコードに意図を込める

Slide 13

Slide 13 text

第3部 自動テストを改善するテク ニック 第10章 トラブルシューティング 第11章 もっと幅広くE2Eテストを使う 第12章 成果を振り返る

Slide 14

Slide 14 text

こだわりポイント 自動テストを始める前のところにボリュ ームを割きました 手動テストをただ自動化するだけで は不十分です やり方だけでなく、考え方を身につ けるのが大事です レガシーなアプリケーションにも適用で きるように なるべく汎用的な書き方にしました わざわざサンプルでレガシーコード を書いています ちゃんとテストしてないから、多分 めっちゃバグがあると思う

Slide 15

Slide 15 text

今日話すこと 書籍第一部からかいつまんで話します どのテストを自動化したいのか 自動リグレッションテストの重要性 手動テストと自動テストのギャップ E2Eテストとは何か

Slide 16

Slide 16 text

どのテストを自動化したいのか

Slide 17

Slide 17 text

自動化したいテスト (1) 仕様通りに動作することのチェック 単体テスト コンポーネントテスト 受け入れテスト

Slide 18

Slide 18 text

自動化したいテスト (2) ルールやアルゴリズムに基づいたチェック プロパティベースドテスト メタモルフィックテスト ビジュアルリグレッションテスト アクセシビリティテストの一部

Slide 19

Slide 19 text

手動でやりたいテスト ユーザビリティテスト 探索的テスト プロトタイプシミュレーション

Slide 20

Slide 20 text

何を自動化したいのかを見極める リリース前の単体・コンポーネントレベルの機能テストを自動化したい パフォーマンスの問題をユーザーより早く見つけたい ブラウザごとの画面表示の違いを効率よく検出したい etc

Slide 21

Slide 21 text

自動リグレッションテストの重要性

Slide 22

Slide 22 text

開発は続くよ、どこまでも 一度テストすれば終わりというわけではない バージョンが上がるたびにテストは必要になる 影響範囲が定められれば良いが、大抵の場合影響範囲を完全に特定するのは困難 例)フレームワークのアップデートは影響範囲が極めて大きいものの例

Slide 23

Slide 23 text

開発とテストの労力の不均衡

Slide 24

Slide 24 text

リソースとのせめぎあい 手動でテストしていると、どうしても範囲や頻度を狭めなくてはならないシーンが出てくる 毎日テストするのは無理だから、毎週、毎月、四半期ごとのテスト 全てのパスをテストするのは無理だから、ハッピーパスだけのテスト すると、自信をもって変更が出来なくなる ソフトウェアの 変更容易性 が低くなる

Slide 25

Slide 25 text

自動テストは変更容易性を保つためにある 自動テストの直接的な効能のうち、最も大きなものは 自信を持ってリリースするのに必要な量のテストを 現実的な作業量に抑えること

Slide 26

Slide 26 text

手動テストと自動テストのギャップ

Slide 27

Slide 27 text

手動テストは柔軟で発見的 手動テストは要件やテスト対象の変化に対して柔軟 手動テストは発見的な動きを取れる 「テストケースに書いてなくても、何かおかしいことあったら教えて!」

Slide 28

Slide 28 text

自動テストは厳密で保証的 自動テストは決められた要件やテスト対象の振る舞いを厳密に確認する 自動テストは保証的に動く

Slide 29

Slide 29 text

実行サイクルの違い

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

手動テストと自動テストの違い

Slide 34

Slide 34 text

E2Eテストとは何か

Slide 35

Slide 35 text

E2Eテストの特徴 ユーザーインターフェースを操作点・観測点として用いる ユーザーストーリーやユースケースなど、ユーザーが価値を達成する手順をテストベー スとする 完全、または大部分が統合されたシステムをテスト対象として用いる ユーザーストーリーの失敗など、ユーザーにとっての価値未達成の発見を主な目的とす

Slide 36

Slide 36 text

E2Eテストの良い点 幅広い用途に利用できる ブラウザやデバイスの 互換性テスト 仕様化テスト 生きたドキュメント 監視

Slide 37

Slide 37 text

E2Eテストの良い点 ユーザーにとっての価値をそのままテストできる 様々なレベルのテストベースを扱える 会員登録などの 機能 会員登録〜商品購入までの ビジネスプロセス

Slide 38

Slide 38 text

E2Eテストの辛い点 (1) 難易度 自動化そのものの難易度が高め テストツールが複雑 ブラウザ ブラウザ自動操作 複雑なシステムには当然バグがある テスト対象のバグと、テストツールのバグを両方扱わないといけない 自動テスト実行中だけ Maximum call stack exceeded エラーが連発する、みた いな経験は大体の自動化エンジニアが経験している 辛い

Slide 39

Slide 39 text

E2Eテストの辛い点 (2) テスタビリティ テストしやすさに配慮する余地が少ない UIはどんなソフトウェアにもあるが、UIを テストしやすくする のは難しい テストのためにUXを犠牲にするなんてことはできない

Slide 40

Slide 40 text

E2Eテストの辛い点 (3) 可読性 どこのページにいるのか、どのユーザーでログインしているのか いまやっているのはテストなのか準備なのか 何を操作しようとしているのか E2Eテストは何も考えずに書くとゴリゴリの手続き型プログラミングになるので テストコードが長くなるほど覚えておくことが多くなる = 認知負荷が高い

Slide 41

Slide 41 text

E2Eテストを成功させるために テストベッドを出来るだけシンプルに設計し テスタビリティを考慮し ときには別のテストレベル(単体テスト等)に移譲し 可読性に気を配る

Slide 42

Slide 42 text

まとめ いろんな種類のテストがある 自動化したいテストとそうでないテストがある ただ自動化するでは開発を支えるようなテストにならない E2Eテストは一番ユーザー目線のテスト E2Eテスト特有の辛さを改善するには色々技術が要る

Slide 43

Slide 43 text

いかがでしたか?

Slide 44

Slide 44 text

他にもこんな話が書いてあります 自動テスト実装のハンズオン トラブルシューティング 高度なユースケース 振り返り

Slide 45

Slide 45 text

過去の資料もどうぞ テストを自動化するのをやめ、自動テストを作ろう https://speakerdeck.com/tsuemura/tesutowozi-dong-hua-surufalsewoyame-zi- dong-tesutowozuo-rou コンテキストとセマンティクスを意識してリーダブルなE2Eテストコードを書こう https://speakerdeck.com/tsuemura/kontekisutotosemanteikusuwoyi-shi- siteridaburunae2etesutokodowoshu-kou リーダブルなE2Eテストコードのための3つのC https://speakerdeck.com/tsuemura/ridaburunae2etesutokodonotameno3tunoc?

Slide 46

Slide 46 text

感想・コメントをお寄せください サポートサイト https://github.com/tsuemura/practical-guide-for-test-automation-support 書籍冒頭に書いてあるんですが、意外と目立たないのか、気付かれていないことが多そう 「良く分からなかった、★1」が一番キツイです たくさん質問して分かってもらえるとありがたいです

Slide 47

Slide 47 text

Q&A

Slide 48

Slide 48 text

> 素朴なテスト自動化と開発を支える自動テストの違いがいまいちピンと来なかっ た。違いは実行するタイミング(実行頻度)のみ? そもそも、手動テストの実行頻度、粒度は果たして最適なのだろうか 人的工数に対しての最適化を行っていないだろうか 開発やリリースを手動テストに合わせに行ってないだろうか 本来テストすべきタイミングでテスト出来ていないのではないか

Slide 49

Slide 49 text

ソフトウェアが「ちゃんと動く」状態になるべきなのはどのタイミング? 理想的には、V字モデルの底に来た時点でちゃんと動くようになっていてほしい 手動テストをただ自動化するだけだと 手動テスト向けに最適化された実行頻度や粒度をそのまま持ってきてしまう 手動テストの制約に合わせた開発・リリースプロセスを変えずに進んでしまう (やり方によっては)手動テストよりもテストの質が落ちてしまう ダメではないが、とてももったいない

Slide 50

Slide 50 text

開発を支える自動テストとは ソフトウェアがちゃんと動く(Production-ready)であることを 継続的 に確認す るためのもの 開発の非常に早い時期から実行可能で、開発者がセルフチェックに使えるようなも の V字モデルの底できちんとテストできるようなもの 違いは何? 主に実行頻度とタイミング そしてそれらを支える実行速度、独立性、信頼性、可搬性 遅いテストは頻繁に実行できない 独立していないテストは並列実行できない 信頼できないテストは実行されなくなる 可搬性の低いテストは一部の環境でしか実行できない

Slide 51

Slide 51 text

> 単体テストであっても、開発者の関心事だけをテストしたいわけでは無いのでは? ディスカッションしたいとのことなので、一旦考えを聞いてみましょう

Slide 52

Slide 52 text

> 単体テストであっても、開発者の関心事だけをテストしたいわけでは無いのでは? 末村の考え 単体テストで扱う「単体」がユーザーに露出することは無い ユーザーにとっての関心事はUIを通してしか露出しない ここでの関心事とは、バリデーションロジックなどの詳細ではなく、バリデーションを通る/ 通らないを指す Tips: 単体テストを「ホワイトボックステスト」だと言うことがあるがこれは誤り テスト設計はブラックボックスでやるべき JSTQB FLシラバスからは「ホワイトボックス/ブラックボックステスト」が削除された

Slide 53

Slide 53 text

> ドキュメントを残すか問題はどこの会社でも起こることだけど、末村さん個人とし てはdocxなどで静的に残すべきか、仕様化テストなどの動くものとして残すべき か、見解があれば聞いてみたい 仕様はルール、テストは例なので、役割が違う。別々に残しておくべき。 しかし、マニュアルや仕様など開発の外側にあるものはたいていメンテされなくなる 仕様とテストをトレーサブルに残しておけるフレームワークが必要 現状の最適解はBDDだと思うが、もっと進歩させたやり方を模索していきたい

Slide 54

Slide 54 text

どのタイミングでどんなCIを行えばよいか気になる(アーキテクチャによると は思うけど) 理想はPRごとに全部回す、現実はTier付けをしてリリースごとに判断する P1は必ず回す、P2以下は状況に応じて回す

Slide 55

Slide 55 text

> E2Eのメンテナンスコストを下げるためのルールなどについての具体例があれば知 りたいと思った 作りすぎない 何をどのテストレベルで見つけるかルールを決める 開発者を巻き込む テスタビリティは開発者が作るもの

Slide 56

Slide 56 text

Enjoy Testing!