マンガ読んだ!!にシステムテストを導入したくて、モブプロでアドバイスを頼んだ話の第3回

システムテストを導入したい。前回の宿題

マンガ読んだ!!というサービスを作っています。第2回に続き、モブレビューしながらプログラミングの第3回です。先ずは前回の宿題を調べた結果の共有。Blazorがテスト用のパラメータみたいなものを持っているものは見つけられませんでした。最近Blazor向けのbUnitが出ていましたが、こちらでもDOMの操作はFindでタグを指定しています。別にこれが証拠になるわけではないですが、まあ現状は普通にDOMで書かれてものを操作するしかないかなという結果です。

モブプロ前の雑談での発見とか

始まる前に大抵雑談してますが、今日はシステムテストとは関係ないけれど、今作っているサービスで有益なことを2つ教えて貰いました。と言っても結構基本的なことです。先ずクッキーの話になって、保存するストレージとしてクッキーが最適か考えた方が良いと言われました。僕はこのサービスが実質初のWebアプリに近いので、結構常識的なことも抜けていたりします。マンガ読んだ!!を作り始めた3年前は特に。その時からクッキーを使っていたので、それ以上考えたことがなかったです。クッキーはストレージとしては最も長く最も広くアクセスできます。本当にそこに保存するべきなのか。他にもローカルストレージやセッションストレージもある。それぞれの保存期間とアクセス範囲を考えると、今の使用用途だとクッキーは最適ではないとなりました。セッションストレージだと短すぎるのでローカルストレージを使うべきだと分かりました。もう一つはこのモブミーティングを始める前にslackにエラー通知が流れて来た話になって、原因が最近入れたTransactionScopeにありそうと言ったら、実行順番をちゃんと意識して作っている?と言われて、あんまり意識していなかったので、そこを見直してみることにしました。これで問題解決になったわけではないですが、これがきっかけで見直して解決したので、ありがたやーちゅう感じです。雑談中に発見があるのもモブプロのメリットですよね。まあ単なる雑談も(かなり)してますけれど。

振り返り

さて、まずは振り返りを兼ねて、Titleをいつ切り替えるべきかで自分の中で疑問が生じたので聞いてみました。そもそも現状遷移用のIDを作って、そっちはDOMが書き終わったタイミングで書き換える。一方タイトルはBlazorの初期化処理の中で書き換える。だったらまとめちゃったら良いんじゃない?と思っていました。まずそもそもいつタイトルを書き換えたいの?という話になりました。モブプロやっていると、結構、このそもそもやりたいことの話になります。つまり話を始める時、自分の中で結論が出ていると結果依りの所から会話を初めてしまいがちですが、相手にとっては前提がないので、これは非常に重要だなと気づかされます。特に自分は結論よりから話す傾向が強いように思えたので、反省しています。で、タイトルを書き換えたいベスト。んー正直あんまりない。タイトルがいつ書き換わるかは重要視していなかった。あえて言うならすぐか、ページが完全に書かれた後かな。ただ、SPAで完全に書かれた後は制御しづらいので、タイトルは一番に書き換えるのが良いとしました。ついでにたまたま最新版を調べたらBlazorの最新版を使えばタイトルの書き換えはjsを使わなくても出来そうな話もしました。

コピペの罪悪感

で、ちょっとずつテストを書くのですが、一旦テストを全部そろえる方針にしたので、前回作ったメソッドをコピーして、今回のメソッド用に一部書き換えるということを繰り返しました。これはねー。正直普段だとちょっとあり得ないやり方で、コピペの罪悪感が結構溜まっていきました。ダーティでも書ききるという方針を作ったので、みんなもこれに関しては言いたいけれど言えないそんな状態。で、僕が、「やっぱりコピペプログラミングは罪悪感が凄い」みたいなことを言ったら、「あ、それなら逆に安心」となりました。「これを許容してやるようではやっぱり厳しいよね」と。今回テスト数を絞ったので、まだましですが、もっとテスト数が多かったらフラストレーション爆発が起きていたかもしれないです。

state管理を数字から名前に

ページが少し揃ってきたので、そろそろstateを数字で制御するのが無理になってきました。最初のページが0で次のページに行ったら1にして、もう1個移動したら2にする。数字で制御できるのは小学生までということですか。で、文字にすることにしました。文字つまり名前になるなら何にするべきか。これはページのファイル名にしました。これであればユニークなのは保証されているし、考える手間も省けます。これでタイトルからそれぞれ、マンガ、シリーズ、作者に移動するフローは出来ました。次は詳細ページです。詳細ページの場合タイトルは固定ではなく、各マンガのタイトルになります。つまり動的に変わります。これはurlがタイトルを持っているので、それと比較することにしました。あとはこれを各ページに充てて量産すれば8個中7個のテストは完成です。

謎バグ

さて終盤謎のエラーに悩まされました。結論から言うとこのミーティングが2週間起きなので、マージをしていないことが大きな原因でした。まあ正直作りも悪かったですが、そもそも間隔が空いたのならマージをしないとは基本ですが、やっている時は見落としていました。。。ただ、それをもってしてもjsファイルが更新されていないのはちょっと分からなかったです。