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

[project-sequencer-statemachine] StoreをDIするように変更 #2495

Merged

Conversation

sigprogramming
Copy link
Contributor

@sigprogramming sigprogramming commented Jan 19, 2025

@voicevox-preview-pages
Copy link

voicevox-preview-pages bot commented Jan 19, 2025

🚀 プレビュー用ページを作成しました 🚀

更新時点でのコミットハッシュ:b9cd67a

@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 19, 2025

すみません、ちょっと一旦方針だけ確認したく…!

スタートマシンできれいに単体テストできる構成だったのが、しづらくなりそうですね…!
そろそろテストを実装できればとも考えているのですが、どういう方針が良さそうでしょうか👀
(ソングエディタ全体でe2eテストを書く or スタートマシンで単体テストを書く or テストを諦める、など) 

ちなみにstoreをDIする形でも単体テストは可能です🙏
(storeをマックすれば良い)
ただシグネチャが変わる度にモック変えないとなので、単体テスト時はそれなりに不便かもです。

@sigprogramming
Copy link
Contributor Author

@Hiroshiba
各ステートのロジックはコンポーネントのロジックでもあります。
(ステートを切り替えるとコンポーネントの振る舞いも切り替わる)
なので、単体テストよりコンポーネントテスト・E2Eテストの方がもしかしたら合っているかもしれません。
(テスト周り、あまり詳しくないので自信ないですが…)
https://ja.vuejs.org/guide/scaling-up/testing#unit-testing

単体テストを行うのであれば、storeのモックと、ブラウザのAPI(requestAnimationFrame、MouseEventなど)のモックが必要になると思います。
(storeのモックの作成は以前の形でも行う必要があると思います)

@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 19, 2025

テストはちょっと僕もわかってないのですが、検証したい項目があり、効果が大きいとこでテストするのが良い気がしています!
ステートマシン単体でテストを書いておけば、ステートマシン自体のリファクタリングやバグ発見が容易にはなると思います。
ステートマシンがどれくらい壊れやすいか・どれくらい変更されやすいか次第かもです。

ステートマシンの単体テストの正常系は例えば、クリックしたらのノートが置かれる(実際にVuex状態変数が変わるのではなく、モック関数を仕込んでおく)、ノートを範囲選択したらステートが移動し想定した状態変数になる、何もないところを範囲選択しても状態が遷移しない、でも選択中に無を範囲選択するとIdleに戻る、とか・・・!
(どの状態に遷移しているかはe2eテストでは得られない)

ちなみにMouseEventのmockは相当簡単(オブジェクト作るだけ)なはずで、requestAnimationFrameは単体テスト時はいらないかも(というより要らないように作る)です!
e2eにするならどんな形でもstoreのモックは不要そう。store+ステートマシンの複合テストをする際はmockがあっても良いかも。(とても大変そうだけど)

なんだかんだ言ってるけれども、結局ステートマシンがどれぐらい壊れやすいのものなのか先見の明がないので、テスト書くべきかどうかわからないんですよねー!!
テスト書くなら絶対に1枚挟んでおいた方が良い(PR前のDIしている形)のは知ってるのですが。。という感じでコメントしました!

うーーーーーーん。
おすすめは今の冗長構成にしといて、やっぱりめんどくさいなとなった&テストを書かなくて良いなとわかったら外すとかでも良いかもです!
まあでもそんなに戻すのも難しくなさそうなので、今もうすでにめんどくさいとかであればstoreと密結合させちゃってもまあという感じです!!(きっと2年後に答えがわかる・・・!)

@sigprogramming
Copy link
Contributor Author

sigprogramming commented Jan 21, 2025

@Hiroshiba
各ステートの処理はUXに関わるものなので、そこそこの頻度で変更されると思います。
なので、おっしゃる通り単体テストを行った方がバグは防げると思います。

e2eにするならどんな形でもstoreのモックは不要そう。store+ステートマシンの複合テストをする際はmockがあっても良いかも。(とても大変そうだけど)

Storeのモックはstate, getter, action, mutationなどをすべて実装しないといけないので大変ということでしょうか?
であれば、ステートマシンで使用する一部のstate, getter, actionのみを定義した型を作れば、useSequencerStateMachineするときはstoreのインスタンスをそのまま渡せて、テストでは一部のstate, getter, actionを実装したモックを渡す形にできると思います。
ひとまずその形にしてみました。 b9cd67a

@Hiroshiba
Copy link
Member

Storeのモックはstate, getter, action, mutationなどをすべて実装しないといけないので大変ということでしょうか?

一応全部実装しなくても可能ではあるのですが、無理やり関数をモックで上書きする形になったりなので、結構不便なんですよね。。。

とりあえず1枚噛ませておけば形は何であれ OK だと思うので、今のプルリクエストの形でいい感じだと思いました!!
Vuex側のstoreの型を変えたらこっちも変更しなくちゃいけなく、回数が増えてきたら大変だと思うので微妙だなと思った時はご相談ください!

Pick<SingActions, "PLAY_PREVIEW_SOUND" | "COMMAND_ADD_NOTES" | ...>
みたいにすればシグネチャをごそっと取ってこれる・・・はず!(型パズルが必要ですが)

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

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

LGTM!!

useSequencerStateMachineで得られたいろんなインスタンスをprovide/injectする感じになりそう・・・でしょうか!
どんな感じの開発心地になるか楽しみです!!!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

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

LGTM!!

useSequencerStateMachineで得られたいろんなインスタンスをprovide/injectする感じになりそう・・・でしょうか!
どんな感じの開発心地になるか楽しみです!!!

@Hiroshiba Hiroshiba enabled auto-merge (squash) January 21, 2025 16:39
@Hiroshiba
Copy link
Member

あ、もしかしたらmainにマージ可能な状態になった感じでしょうか? 👀
マージ方針どうして行くのがいいのかなーと!

ちょっとパット考えた案まで:

  • 一気に全部置き換えてマージする
    • mainブランチにこのブランチをマージした後、もしくはこのブランチでマージ作業をした後に。
    • 変更中にmainブランチのステート周りのロジックが変わるとマージがかなり大変になりうる
  • 一旦mainにマージした後、ステート管理を2種類にして、徐々に置き換えていく
    • 一番合理的ではあるけど、どっちもある状態をメンテナンスするのが大変かもしれないのと、単純に計算量が2倍になる
    • 移行が時間かかりそうならこっちの方が良さそうかも

@Hiroshiba Hiroshiba disabled auto-merge January 21, 2025 16:48
@Hiroshiba Hiroshiba merged commit a600597 into VOICEVOX:project-sequencer-statemachine Jan 21, 2025
10 checks passed
@sigprogramming
Copy link
Contributor Author

@Hiroshiba
「一気に全部置き換えてマージ」が良いかなと思います!
project-sequencer-statemachineで置き換えまで行って、その後mainにマージを考えています、置き換え自体は簡単にできると思います)

@sigprogramming sigprogramming deleted the store_di branch January 22, 2025 13:01
@Hiroshiba
Copy link
Member

承知しました!!

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.

2 participants