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

AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例

AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例

レバテックLAB「型定義&インタラクションテストでAIフロントエンド開発のガードレールを整備する」で発表した資料です。
https://levtechlab.connpass.com/event/379346/

Avatar for tonkotsuboy_com

tonkotsuboy_com

February 04, 2026
Tweet

More Decks by tonkotsuboy_com

Other Decks in Programming

Transcript

  1. フロントエンド開発では、UIの見た目や挙動をテストする必要 がある テストコードを見て、そこからUIを想像するのは厳しい TypeScript test("ボタンをクリックするとモーダルが表示される", () => { render(<UserProfile />);

    fireEvent.click(screen.getByRole("button", { name: "詳細" })); expect(screen.getByRole("dialog")).toBeInTheDocument(); expect(screen.getByText("ユーザー情報")).toBeVisible(); }); フロントエンド開発におけるテストの辛さ
  2. TypeScript export const Default: Story = { play: async ({

    canvasElement }) => { const canvas = within(canvasElement); // 見出しの文言が正しく表示されているかを確認 expect(canvas.getByRole("heading", { level: 3 })).toHaveTextContent( "頭痛外来で待たない診察はこちらから", ); }, }; コード例: 見出し文言が正しく表示されているかのテスト
  3. TypeScript await expect( canvas.getByText(/頭痛外来で処方できるお薬の例/) ).toBeVisible(); TypeScript await expect( canvas.getByText(/生活習慣病外来で処方できるお薬の例/) ).toBeVisible();

    TypeScript await expect( canvas.getByText(/皮膚科で処方できるお薬の例/) ).toBeVisible(); ページを量産しつつ、storybookで見出し文言のテスト
  4. TypeScript expect( canvas.getByRole("link", { name: "ズキンズキンと痛む" }) ).toHaveAttribute( "href", "/telemedicine/headache"

    ); TypeScript expect( canvas.getByRole("link", { name: "生活習慣病外来" }) ).toHaveAttribute( "href", "/telemedicine/lifestyle" ); ページを量産しつつ、storybookでリンク先のテスト
  5. TypeScript import type { Preview } from "@storybook/react"; import {

    sb } from "storybook/test"; sb.mock(import("../hooks/useReceptionVerificationCode")); sb.mock(import("../hooks/useCurrentDate")); sb.mock(import("next/navigation")); const preview: Preview = {}; export default preview; preview.tsでモジュールをモック対象に設定
  6. APIから受付コードを取得するカスタムフックをモック 受付コードが必ず「'123456' 」を返すように TypeScript export const Default: Story = {

    beforeEach() { mocked(useReceptionVerificationCode).mockReturnValue({ receptionVerificationCode: "123456", errors: [], }); }, }; 例: 受付確認コードを正常に取得できた状態をモック
  7. APIがエラーを返すようにする TypeScript export const WithError: Story = { beforeEach() {

    mocked(useReceptionVerificationCode).mockReturnValue({ receptionVerificationCode: "", errors: ["受付番号が見つかりませんでした。"], }); }, }; 例: エラー状態をモック
  8. v9まではNode.jsのSubpath importsを使っていた(コード参照) v10からautomockでラクになった JSON { "imports": { "#hooks/useReceptionVerificationCode": { "storybook":

    "./src/hooks/useReceptionVerificationCode.mock.ts", "default": "./src/hooks/useReceptionVerificationCode.ts" } } } Storybook 10からモックの方法がラクになった