to Developer
安全にプロダクト品質を改善できる!ほぼ100%のテストカバレッジがある世界
2023.05.10
鈴木
安全なリファクタリングを実現するための高いテストカバレッジの重要性
CREW Expressはビジネス領域が複雑なためDDDで開発をしています。配達パートナーです。
コードベースの肝となっているDomainsとUseCasesのテストカバレッジはほぼ100%です。
CREW Expressバックエンドのテストカバレッジ
※All Filesが低いのはLibrariesには生成したファイルが多くありますがそれらはテストコード書いていないためAll Filesのテストカバレッジが低いためです。
CREW ExpressではRailsを利用しているため、静的型検査等による恩恵を受けることが難しく、リファクタリングには大きなリスクが伴います。
しかし、ユニットテストのテストカバレッジが高いことにより、そのような言語のサポートがない場合でも、安全にリファクタリングを行うことができるため、開発効率の向上とプロダクト品質の維持に貢献しています。
テストカバレッジの高さが、どのようにリファクタリングに貢献したかについて説明をします。
DDD導入をすすめ、Formクラスをユースケースやドメインサービスへと変更
まず、最初にリファクタリングをしたのはDDDの導入をすすめるためにおこなったFormクラスのリファクタリングです。
Formクラスは、ドメインを表す適切なクラス名にできていないという問題があったため、ユースケースクラスやドメインサービスクラスに変更することで、プロダクトの内部品質を向上させることができました。 大きなコード変更でしたが、高いテストカバレッジのおかげで、バグがおきることなく順調にリファクタリングができました。
詳しくは以下の記事を参照してください。
https://qiita.com/suzuki-mar/items/be121a2d0eacbd85f577#何をするのかが名前からでは理解できないformクラスのリファクタリング
コンテキストマップのリファクタリングも漸進的におこなうことができてきた
コンテキストマップについてもドメイン領域の理解やビジネスの変化・進化にあわせて漸進的にリファクタリングをしてきました。
具体的には次のような流れでコンテキストマップを改良しました。
最初にコンテキストマップを作成したときは、配達と配達パートナーのマッチングは同じコンテキストにありました。 しかし、コンテキストをシンプルにするため、配達とマッチングのコンテキストを分けることにしました。
さらにビジネスモデリングの変化によって、マッチングをマーケットプレイスと配送管理システム(TMS)の2つのコンテキストへ分けることになりました。 このようなビジネスモデリングの変化にともなうコードの変更は、逐次できていないと大きな負債になってしまったり、コンテキストマップが間違った情報を伝えてしまうことになります。 ビジネスモデリングにともなうコンテキストの変更では、大規模なクラスの移動や呼び出し関係の変更などが必要になります。 CREW Expressでは高いテストカバレッジのおかげで、このような大きめなリファクタリングでも、想定外の影響範囲があった場合はテストが失敗するため、すぐに気がつくことができます。
また、小さいリファクタリングも頻繁におこなうことができるため日々コードの内部品質を向上させることができます。
このように、日々コードの内部品質を高い状態に保たれていることで、開発者は新しい機能の追加に集中できます。 また、内部品質の高いコードは、将来的に発生するバグを減らし、保守性を向上させることもできます。 このようにテストカバレッジが高いことは、プロダクトの品質を維持し、開発者が新しい機能を追加することに集中するためには必要不可欠な要素です。
リファクタリングがユーザーエクスペリエンスに与える影響
前述の通り、テストカバレッジが高い状態を保つことで、開発チームは安全にリファクタリングを進めることができます。 リファクタリングによって、コードの可読性が向上し、保守性や拡張性が高まります。 しかし、リファクタリングを行う際には、意図せずプロダクトの機能が変化してしまうことがあります。そのような問題を防ぐためにも、高いテストカバレッジが必要になります。
さらに、テストカバレッジが高いことは、ユーザーにとってもメリットがあります。 テストカバレッジが低い場合、ユーザーがプロダクトを利用する際の不安定な動作につながる可能性があります。 例えば、ユーザーが想定していない動作が起こる、あるいはエラーが表示されるなどです。 そのような場合、ユーザーは不快な体験をしてしまうことになります。 高いテストカバレッジを保つことで、プロダクトの品質を維持し、ユーザーに安定した体験を提供できます。
今後はE2Eも充実していきたいです
高いテストカバレッジがあるため、テストにおいては十分に見えそうですが、サービスの都合上E2Eテストはあまりできておりません。
CREW Expressは、配達パートナーが使用する配達アプリを含む複数のアプリケーションが統合されたサービスです。 これらのアプリケーションは、実際の運用環境においては複雑な操作や実際の移動をすることがあります。 そのため、E2Eテストを行うためには、実際の運用環境に近いテスト環境を構築する必要があります。 しかし、これは非常に困難であるため、私たちはまだE2Eテストに注力できていません。
E2Eテストを行うことで、ユニットテストでは確認できないサービス全体の仕様の不備やバグの検知ができます。 そのため、私たちは今後、ユニットテストだけでなくE2Eテストにも取り組み、システムの品質を高めていくことを目指しています。
最後に
最後に、テストカバレッジが高いということは、開発チーム自身がプロダクトに自信を持っているということでもあります。 テストカバレッジが高く、コードの品質が高いということは、開発チームがプロダクトに対して真剣に向き合っているということでもあります。 今後、CREW Expressはより様々な企業に導入してもらうことになっていきますが、高いテストカバレッジがあることで大きめの設計の変更やリファクタリングをするときにも自信をもっておこなうことができると確信しています。
Azitは高品質なプロダクトを目指し、テストカバレッジだけでなく設計や開発プラクティスにも力を注いでいます。開発チーム内での議論や読書会などの勉強会を積極的に行い、知識や技術の共有を促進しています。
現在、CREW Expressの開発に共に取り組んでいただけるほうを募集しています。興味をお持ちの方はカジュアル面談などでの情報共有でもいいのでぜひご応募ください。