こんにちは、SOMPO Digital Lab QAエンジニアの穴原です。
今日は私たちSOMPOホールディングスの内製開発組織であるSprintチームで行なっているアジャイル開発における品質向上に関する取り組みをご紹介します。
昨今では世の中的にもソフトウエアの品質を維持するための方法として
品質の向上=たくさん打鍵する
以外のやり方でソフトウエア品質の向上に取り組んでいる事例も多く共有されているかと思います。
私たちのチームでも世の中の取り組みを参考にしながら開発プロセスを日々見直して改善をしています。
本日は、私たちの開発現場でアジャイル開発による頻繁なリリースと品質の維持との両立を目指して行っている様々な取り組みについて皆さんに共有したいと思います。
前提
私たちのチームでは基本的にはアジャイル開発手法を取り入れたプロダクト開発を行なっています。
ユーザーからのフィードバックを早期に認識し、柔軟に仕様を変更し、ニーズに沿ったプロダクト開発をスピーディーに行うことを念頭に置いています。
スクラムチームのメンバーにはプロダクトオーナー、サービスデザイナー、プロダクトデザイナー、エンジニア、QA、SM/PMOなどのロールからなるメンバーから構成されていて、7人程度を1チームとして編成していることが多いです。
これらのメンバーがそれぞれのスペシャリティを活かしながら利用者からのフィードバックをOneTeamとして迅速にプロダクトへ反映できる体制を作っています。
アジャイル開発で品質を高める仕組み
アジャイル開発では頻繁なフィードバックによってユーザーの意図を汲んだプロダクト開発がしやすくなるメリットがある一方で、利用可能なプロダクトを頻繁にリリースする必要があります。
ただ、これまでのウォーターフォール的な品質保証プロセス(リリース直前の打鍵で全てを解決する)では短い期間で大量のテストをこなさなければならず、アジャイル開発を進めるには辛いものがあります。
そのため、私たちの組織では
- 各工程のアウトプットの質を向上させ、後工程での手戻りを減らすこと(シフトレフトを実践し、後工程のテストに頼りすぎない)
- 自動化できる作業の割合を増やしていくこと
- 生産性を高める工夫をすること
を意識しながら開発を行うことで短いリリースサイクルでも品質を維持できるように努めています。
手戻りの少ない開発プロセス
プロダクト開発の初期段階から手戻りを少なくするために、W字モデルを開発プロセスの中に取り入れています。
例えば、私たちのチームでは設計が完了してから実装が始まるまでの間に設計のレビューを行なっています。このプロセスに対してQAも参加することで品質に関連する指摘を強化し、実装時の手戻りを防ぐように努めています。
具体的にはエンジニアが作成した設計内容に対して、他のエンジニアが実装に向けて内容の確認を行うとともに、QAもテストケースの作成を行いながら設計のレビューを行なっています。
テストケースを作成する過程で、仕様が定義されていない箇所、他の機能との共通性や整合性が失われている部分への質問を行いながら、設計の品質を高められるようにしています。
スピード感を持って仕様の策定を行うために設計内容が常にドキュメントとして綺麗にまとまっているわけではないこともよくあります。そのため状況に応じて各種資料、Slackや会話から情報を仕入れ、仕様がドキュメント化されていない箇所はQAがまとめるなど、柔軟な動き方を行なっています。
また、実装についてもエンジニアの実装後のテストをDockerで構築したローカルの環境だけでなく開発環境へデプロイして行うなど、開発内容に応じた動作確認を十分に行うことで後続でのQAによるテストでのバグ検出を抑えています。
そのほかにもバグの発生傾向を分析した結果を改善に活用しています。 例えば実装漏れによるバグ検出が多い傾向がわかればそれを防ぐためにプロセスを改善したり、様々な取り組みで手戻りを抑えた開発を目指しています。
自動化できる作業を増やす
手戻りを減らすと同時に、人力に頼らない作業を増やすようにしています。
Sprintチームには新しい取り組みは積極的に取り入れる風土や予算に恵まれている背景もあり、メリットのある有効な手法やツールへの投資は惜しまない方針に基づいて動いています。
各種テストの自動化
CIに連動する形で様々な自動テストが実行されています。 これらの自動テストは人力での作業を減らす目的とともに、シフトレフト実践の側面も持っています。
PRがGitに提出されるたびにGitHub Actionsを利用してコードの静的解析、ユニットテスト、SASTが実行されます。そしてその結果がPRにフィードバックがされるため問題のあるコードについては早期に検出され、そのままメインブランチへマージされることを防ぎます。
機能テスト
ユニットテストはJest、pytest等の各言語のテストライブラリを用いて作成をしています。
テストを作成する際には「ControllerからRepositoryクラスまで通したテストは必須とする」など、十分なテストコードが作成されるような定性的なルールをエンジニア主体でチーム内に設けるとともに、テストカバレッジ(リポジトリ全体だけでなく各ファイル単位での)を取得し、定量的にもテストの不足がないかチェックできるようにしています。
また、E2Eテストの自動化も行なっています。 E2Eテストの場合には実行時間がかかるため必ずしもGitHub Actionsの中に含める形にはしていないですが、定期的に実行して主要動線が正常に動作することを維持し続けています。
E2Eテストの自動化にはAutifyを利用しているので比較的簡単にテストを作りやすいのですが、だからと言って作りすぎないようにしています。 テストピラミッドの考え方に基づいたE2E以外では検証できない重要な動線に絞ってテストをするように気をつけています。
セキュリティテストツールの活用
SASTツールとしてSnyk、DASTツールとしてStackHawkを利用しています。 Snykに比べてStackHawkは実行時間がかかるので、PRとの連動はさせずにスケジューリングして実行しています。
検知した内容に応じて対処を行なっていて、高レベルアラートについては即時対応、中レベルのアラートについては対処の難しさやリスクに応じて対応を決定しています。
コードレビューツールの活用
コード静的解析には各種LinterやSonarCloudを利用しています。これらツールもGitHub ActionsによりPRと連動して実施されます。
エンジニアによる相互でのコードレビューに加えて、コードレビューツールを使ったレビューも品質を支える重要な要素となっています。 エンジニアとツールによるコードレビューを併用、徹底することで、バグの早期発見と修正、そしてコードの保守性の維持が行われます。
これにより現時点でのコード品質に加えて、将来的な拡張性も一貫して保たれるだけでなく、エンジニア間の知識共有も促進されています。
ちなみにSonarCloudについては技量のあるエンジニアほど指摘内容に学びがあると感じているようです。
いずれのテスト、レビューについてもリリース直前に慌てて実行するのではなく、なるべく早期から必要なテストを繰り返し行うことで、常に一定水準のソフトウエア品質を維持するようにしています。
生産性を高める工夫
生産性を高める工夫として、テストケースの共通化や再利用可能なテストケースの作成にも力を入れています。 テスト管理ツールとしてZephyr ScaleというJiraのプラグインを利用しています。
このツールでは共通して利用できるテストケースを部品として作成しておき、各テストケースからその部品を呼び出すような形でテストケースの共通化を行うことができます。
そのほか、一度作成したテストケースは簡単に繰り返し利用できたり、テスト結果とJiraのバグチケットを紐づけることができてテスト実行を阻害するバグの修正状況の確認が簡単だったり、ボタンひとつで打鍵結果のレポートが出せたりなど、かゆいところに手が届くツールになっています。
(詳しくはJira のプラグイン Zephyr Scale でテストケースを管理する - SOMPO Digital Lab 開発チームブログの記事にも記載しています。)
プロダクトの状態をモニタリング
私たちのチームでは常時複数のプロダクトの開発を並行して行っており、それぞれの案件で上記の工夫を取り入れながら開発を進めています。
これらの取り組みによって順調に開発を進められているかを定量的に把握できる仕組みとして、品質に関連するメトリクスを収集してダッシュボード上に可視化し、指標として活用しています。
具体的には実装やテストのチケット消化状況、テストケースの作成、打鍵状況、プロダクトのバグの発生数などを横断的に参照、比較できるようにしながら、各プロダクトが適切に開発を進められているかを判断しています。
これにより、問題が顕在化する前に対応を検討するなど迅速に対応し、プロダクト全体の品質を維持することを目指しています。
まとめ
いかがでしたでしょうか?
Sprintチームでは頻繁なリリースとより良い品質との両立につながるように開発プロセスを常に改善しております。その成果もあってか現在では段々と安定した品質を持つプロダクトを提供できるようになってきています。
ただ、まだまだ改善が可能な取り組みもあります。
スクラムチームのQAとして直接プロダクトを育てるとともに、チーム内の開発プロセスの成熟を通じて安定的に品質の伴ったプロダクトを提供できればと考えており、多くの仲間とその実現を目指していければと考えています。
SOMPO Digital Labでは一緒に働くエンジニアを募集しています
SOMPO Digital Labではエンジニアを募集しています。
以下のリンクからカジュアル面談の応募ができますので、興味を持った方は是非話を聞きに来て下さい!