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

Starting & Sustaining Code-Based E2E Testing fo...

Avatar for teyamagu teyamagu PRO
September 18, 2026

Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )

JaSST'26niigata( #jasstniigata ) での、「プログラミング未経験者を含むQA組織で、コードベースE2E自動テストをどう始め、どう続けるか」の発表資料です

Avatar for teyamagu

teyamagu PRO

September 18, 2026

More Decks by teyamagu

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 • • 株式会社LayerX 所属 / 個⼈事業主 ◦ テスター /

    コーチ / コンサルタント / プログラマー ◦ 現場でテストコードのレビューをし続けています 翻訳 ◦ ◦ • Teppei YAMAGUCHI 『ソフトウェアテストをカイゼンする50のアイデア』 『Fearless Change』 コミュニティワーク ◦ ◦ ◦ © LayerX Inc. Regional Scrum Gathering Tokyo 実⾏委員 SQiP 研究会 研究コース4「アジャイルと品質」アドバイザー テスト⾃動化研究会 お世話係 2
  2. 課題 課題① テストを1本書くまでの判断が多い テストを1本書くまでに必要な判断の⼀部 • • • • • このテストは、どのファイルに置く?

    テストケースの名前は? メソッドの名前は? この処理は共通化する? しない? 待ち⽅は? ロケーターはどれを選ぶ? アサーションはどの粒度で書く? © LayerX Inc. 8
  3. アプローチ 全体の流れ 今回は私 ① 最初の⼀⼈が 型を作りきる 型ができたら ② 巻き込む∕レビューを 最初の⼀⼈に集約する

    ③ 最初の⼀⼈による レビューをやめる レビュー指摘がなくなったら ① 判断回数を減らすガイドやコーディングルール、サンプルコードで構成する 型を最初の⼀⼈が作りきる ② 巻き込みつつ、⼈により判断がぶれないように最初の⼀⼈にレビューを 集約する ③ レビュー指摘がなくなったら、最初の⼀⼈によるレビューをやめる © LayerX Inc. 13
  4. アプローチ 例:「保存」ボタンをクリックしたい • 「保存」ボタン要素を、どの種類のロケーターで定義しますか? A. B. C. D. E. •

    data-testid 表⽰されている「保存」の⽂字 role とアクセシブルネーム CSS セレクタ(.btn-primary) XPath(フォーム内の3番⽬のボタン) どれでも動く ◦ ただし、UI の変更に強い種類と、どの要素でも使える種類は異なる ◦ 要素に応じて選ぶ © LayerX Inc. 15
  5. アプローチ ガイドやコーディングルールとして決めること(1) 要素は、極⼒、上位の種類のロケーターで定義する A. B. C. D. E. テスト⽤に割り振ったID(data-testid、getByTestId) 表⽰されているテキスト(getByText)

    role とアクセシブルネーム(getByRole) class / id / name、タグ名との組み合わせ(.btn-primary など) XPath による何番⽬や列指定などの構造情報 ※ Playwright 公式は role を先に勧める。 A を最優先にしたのは、⾃分たちで管理でき、⽂⾔やスタイルの変更では壊れないから © LayerX Inc. 16
  6. アプローチ 例:申請プロダクトの requests/new 画⾯の要素定義をしたい • この画⾯の要素定義、どこに置いて何と呼びますか? ◦ ◦ ◦ ◦

    • A pages/requestNew.ts に RequestNewPage クラス B pages/workflow/requests/new.ts に WorkflowRequestsNew クラス C pages/申請/新規作成.ts に CreateRequest クラス D specs/ のテストケースと同じファイルの中に書く どれでも動く ◦ ただし、次に書く⼈とAIが、同じ答えにたどり着けるか © LayerX Inc. 17
  7. アプローチ ガイドやコーディングルールとして決めること(2) 可能な限り、名前は「決める」のではなく「決まる」ようにする • クラス名とファイル名は、プロダクト名かドメイン名と URL の階層で決まる ◦ ◦ ◦

    URL {申請プロダクトドメイン}/requests/new ファイル pages/workflow/requests/new.ts クラス WorkflowRequestsNew ※「workflow」は「申請」プロダクトを指す • 要素名は、⾒た⽬にあわせて名付ける。input タグでも、ボタンなら 〜Button © LayerX Inc. 18
  8. アプローチ ガイドやコーディングルールとして決めること(3) ファイルの保存場所や依存関係も、先に決めておく • ディレクトリ構成 root/ pages/ // 画⾯の要素定義と、1画⾯内の操作(Page Object

    Model) shared_components/ // サイドバーなど、プロダクトごとに共通の部品 steps/ // ページをまたぐ⼀連の処理 specs/ // E2Eテストケース (ほか testdata/ utils/ download/) • • • steps と specs は、直下がプロダクト名(doc-issue / id / payer …) pages は、直下がプロダクト名かドメイン名。その下は URL の階層 参照の向きを固定する specs → steps → pages / specs → pages © LayerX Inc. 19
  9. アプローチ ルールを全部守ると、こうなる test("パスワードが未入力の場合ログインに失敗すること ", async ({ page }) => {

    // 期待値:パスワードが未入力だとログインできない const idIndex = new IdIndex(page); const idAuthSignIn = new IdAuthSignIn(page); await idAuthSignIn.load(); // 固定IDで失敗が続くとロック時のメッセージになるため、ランダムな IDで試みる await idAuthSignIn.usernamePlaceholder.fill(`hoge+${utilsGenerateTimestampedUniqueId()}@XXXXXX`); await idAuthSignIn.passwordPlaceholder.fill(""); await idAuthSignIn.loginButton.click(); await expect(idAuthSignIn.alertToast).toContainText("ユーザー名とパスワードを入力して下さい "); await expect(idIndex.globalNavigationBar.productDropdown).toBeHidden(); }); IdAuthSignIn:プロダクト名(id)と URL(/auth/sign_in) の階層から決まる loginButton:ボタンだから 〜Button expect ×2:アサーションは spec に残す © LayerX Inc. 20
  10. アプローチ 最初の⼀⼈が作りきるテストケースに含めていること ファイルの書きはじめや、基本的な操作が書かれたファイルを⽤意する 例) • • • • • ファイル内で実装しているテストケースのテスト設計書へのリンク

    テストアカウントの定義 テストケース内でのログイン⽅法 テストケース内での主要フローの実装‧利⽤ テストケース内でのテストにおける期待値の表現 © LayerX Inc. 21
  11. アプローチ サンプルコードの上部 import { IdAuthSignIn } from "@pages/id/auth/sign_in"; import {

    IdIndex } from "@pages/id/index"; import { test, expect } from "@playwright/test"; import { utilsGenerateTimestampedUniqueId } from "@utils/generateTimestampedUniqueId"; // テストケース表 : 「[ID] テストケース表」の「【 ID】認証」シート // パスワードが未入力の場合ログインに失敗すること // https://docs.google.com/spreadsheets/d/XXX/edit?gid=YYY#gid=ZZZ&range=xx:xx test("パスワードが未入力の場合ログインに失敗すること ", async ({ page }) => { 【以下略】 © LayerX Inc. 22
  12. 巻き込み レビュー指摘を、AI向けのガードレールに書く • • 当初狙ってはいなかったが、AIに問題を繰り返させないために、 レビュー指摘をAI向けのガードレールに書いている ガードレールとして書いていること(⼀部) ◦ ◦ ◦

    ◦ ◦ • 既存のテストと同じ形で書き、新しい書き⽅を持ち込まない ロケーターは UI 上の意味で狭く定義する アサーションは spec に残す。意味のないアサーションを作らない タイムアウト、ループ、リトライを雑に書かない シナリオは、共通化(DRY)より業務の読みやすさを優先する これらはレビューをしながら増やしている © LayerX Inc. 27
  13. 巻き込み レビュー指摘がなくなったら、最初の⼀⼈によるレビューをやめる • 同じ指摘が2〜3回出たら、ガイドやガードレールに書く ◦ • 最初の⼀⼈によるレビューをやめる流れ 1. 2. 3.

    • 書いた分、次のレビューで⾔うことは減る 直接、最初の⼀⼈がレビューする 慣れてきたら、まず書く⼈同⼠でレビューし、最初の⼀⼈は最後に⾒る 2. で書いた⼈同⼠でも、最初の⼀⼈によるレビューでも、レビュー指摘がなくなり 安定したら、最初の⼀⼈によるレビューをやめる 書く⼈同⼠のレビューは、レビューの練習でもある ◦ 指摘された⼈と指摘した⼈の両⽅が学ぶ © LayerX Inc. 28
  14. まとめ どう始め、どう続けるか • • 始め⽅ ◦ 「みんなで⾃動テストを書こう」をやめ、まず最初の⼀⼈が型を作りきる ◦ 型は、判断回数を減らすガイドやコーディングルール、サンプルコード 続け⽅

    ◦ 巻き込むのは型ができてから。レビューは最初の⼀⼈に集約する ◦ レビュー指摘がなくなったら、最初の⼀⼈によるレビューをやめる ◦ ただし、状況に応じて再開することもある © LayerX Inc. 35