Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Storybookを導入する #2140

Merged
merged 10 commits into from
Jun 29, 2024
Merged

Storybookを導入する #2140

merged 10 commits into from
Jun 29, 2024

Conversation

Hiroshiba
Copy link
Member

@Hiroshiba Hiroshiba commented Jun 27, 2024

内容

Storybookを導入してみます。
とりあえずアップデート通知ダイアログをテストしてます。

使い方もREADMEに書きました。
とりあえずnpm run storybookして、*.stories.tsを定義すればOKなはず。

とりあえず表示だけで済む(Vuexがいらない)コンポーネントを選びました。
今後のリファクタリングの方針によってはVuexを指すことになりそう?
(どうやってmock入れれば良いだろう・・・。)

Storybookでのテストはユニットテストに足してみました。
一番わかりやすいのはインテグレーションテスト(統合テスト)なのですが、まあ何が統合テストで何が単体テストなのかは最近考えなくてもいい風潮があるので、一緒にしてみました。
(単体テストと一緒にしないならe2eテストになるけど、ただ表示するだけどテストとかなのでe2eかというと微妙だなと)

chromaticにも登録してみました。とりあえずmainブランチ更新されたら更新される・・・はずです。
たぶんChromaticのURLはここ https://www.chromatic.com/library?appId=667d9c007418420dbb5b0f75
Chromatic内のStorybookのURLは・・・どこになるかわからないです。。
たぶんここ・・・? https://main--667d9c007418420dbb5b0f75.chromatic.com/
ちなみに今のStorybookはこのあたりです

スクリーンショット・動画など

image

その他

@Hiroshiba Hiroshiba marked this pull request as ready for review June 27, 2024 20:00
@Hiroshiba Hiroshiba requested a review from a team as a code owner June 27, 2024 20:00
@Hiroshiba Hiroshiba changed the title WIP: Storybookを導入する Storybookを導入する Jun 27, 2024
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

npx sb init --builder @storybook/builder-viteしたら入る設定ほぼそのままです。ファイルパスもここ。

唯一docgen: "vue-component-meta",がドキュメントの自動生成に必要?っぽかったので足しました。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こっちのファイルもほぼinitで入るのをVOICEVOXに合うようにしていっただけです。

Previewはちょっと違うのでメモします。

const preview: Preview = {
  tags: ["autodocs"], // Storybookにドキュメントを自動生成する
  parameters: {
    docs: {
      toc: true, // 自動生成したドキュメントに目次をつける
    },
  },
  argTypesEnhancers: [addActionsWithEmits], // Vueの`emit`系を自動的にイベントに登録する。argTypeをactionにすればイベントになるらしい。
};

Comment on lines -174 to 206
## リント(静的解析)
## コードフォーマット

コードの静的解析を行い、バグを未然に防ぎます。プルリクエストを送る前に実行してください。
コードのフォーマットを整えます。プルリクエストを送る前に実行してください。

```bash
npm run lint
npm run fmt
```

## コードフォーマット
## リント(静的解析)

コードのフォーマットを整えます。プルリクエストを送る前に実行してください。
コードの静的解析を行い、バグを未然に防ぎます。プルリクエストを送る前に実行してください。

```bash
npm run fmt
npm run lint
```
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リントしてエラーになって手動でフォーマットしたあとにフォーマット方法に気づいた、みたいなことがないように逆にしてみました

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

同じテストをStorybookに移したのでこっちはいらないはず

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

アプデ通知ダイアログのStoryとかが置いてるのがここ。
コピペすれば別のコンポーネントにも使い回せるはず。

最初にPropsとかを定義して、あとはユースケースに合わせてStoryとPlayを書く感じ。

ダイアログはまだStorybookと相性悪い感じでした。

Comment on lines 76 to 82
const props = defineProps<{
/** ダイアログの表示状態 */
modelValue: boolean;
/** 公開されている最新のバージョン */
latestVersion: string;
/** 表示するアップデート情報 */
newUpdateInfos: UpdateInfo[];
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こうやってドキュメントを書けばStorybookに反映される。
(今回はダイアログだから自動ドキュメントがないけど。。)

newUpdateInfos: UpdateInfo[];
onSkipThisVersionClick: (version: string) => void;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

イベントはコールバックにするやり方と、emitにするやり方があるけど、emitにするとドキュメントがいい感じになるのでそっちのが良さそう。
これはコールバック形式だったので移動しました。

Comment on lines +85 to +88
/** ダイアログの表示状態が変わるときに呼ばれる */
(e: "update:modelValue", value: boolean): void;
/** スキップするときに呼ばれる */
(e: "skipThisVersionClick", version: string): void;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

イベントのドキュメントの書き方に悩みました。
とりあえずコンポーネント側から見て「~するときに呼ばれる」としました。

Quasarのドキュメントを参考にしてます。
Emitted when showing/hiding state changes.みたいな文になってました)

@@ -58,6 +58,32 @@ jobs:

- run: npm run test:unit

- name: Setup playwright
run: npx playwright install
- name: Run Storybook tests
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unitテストかe2eテストかどちらかと言われればunitテスト(エンジンが不要)なので、unitテストのjobに足しました。
npm ciが長いので基本直列のがお得かなと。

Copy link
Member Author

@Hiroshiba Hiroshiba Jun 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

お試しでChromaticにもpushしてみてます。

https://www.chromatic.com/docs/github-actions/
に書いてたコードほぼそのままです。

Comment on lines +114 to +122
### コンポーネントのテスト

Storybook を使ってコンポーネントのテストを行います。

```bash
npm run storybook # 先に Storybook を起動
npm run test:storybook
npm run test-watch:storybook # 監視モード
```
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Storybookをdevで起動してからtestを回す、みたいな設計になってました。
リモートにあるStorybookでテストを回せるようにする設計みたいです。

@Hiroshiba
Copy link
Member Author

多分大丈夫だと思うのでマージします!

エンジンのモックを書こうと思います。
そうすればVuexも含むテストがいっぱい書けるようになるはず!

@Hiroshiba Hiroshiba merged commit 885319b into VOICEVOX:main Jun 29, 2024
9 checks passed
@Hiroshiba Hiroshiba deleted the storybook branch June 29, 2024 13:08
@Hiroshiba
Copy link
Member Author

VuexでStoreをmockするコード

// デコレーター
export const decorators: Decorator[] = [
  (story, context) => {
    return {
      setup() {
        const store = createStoreWrapper();
        provide(storeKey, store);
        context.parameters.storeState = store.state;
        return story()
      },
    };
  },
];

// store側export function createStoreWrapper() {
  return createStore<State, AllGetters, AllActions, AllMutations>({
    ...
  }
}
export const store = createStoreWrapper();

chromaticのgithub actionsが落ちちゃったので修正します 🙇

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant