プロダクトの品質を上げるため、ソフトウェアの構造をより良い状態にしていく方法について考える今回。前編では、ソースコードのリファクタリングの進め方を紹介しました。
ソースコードを変えたらテストを実施
リファクタリングによりソースコードを変更したら、そのつどテストする必要があります。外部から見た挙動が変わらないようにしたつもりでも、意図どおりに動作する保証はなく、実際にプログラムを動作させて検査してみないと確実に動作するかわからないからです。とくに継続的なリファクタリングの実施においては、ソースコードに変更を加えたら即テストを行えることが重要です。すぐにテストを行わないと、あとあと問題が発生した際に、どこに原因があったのか特定するのに時間がかかるためです。さいわい、自動的なユニットテストのフレームワークがプログラミング言語ごとにあり、たとえばJavaではJUnitと呼ばれるテストフレームワークがあります。
これらのテストフレームワークは、プログラムをテストするプログラムをあらかじめ作成しておき、それを随時実行して成功・失敗の結果を出力できます。Bitbucket ServerとBambooを組み合わせると、ソースコードを変更してコミットしたらユニットテストが実行されるように設定できます。さらに、新機能開発などでトピックブランチを作成する際に、派生元ブランチのビルドやユニットテストが成功しているかどうか確認できます。それらが失敗しているブランチでは品質が十分でないため、派生ブランチを作成すべきではありません。
ユニットテストはすばらしい考え方ではありますが、現在のところ手作業によるテストをすべて置き換えるには至っておらず、ユニットテストによる自動テストと、手動によるテストを併用するのがよいと思います。無理にユニットテストだけで行おうとすると、プロダクトの仕様が変わったときにユニットテスト部分の変更に多大な工数がかかるなど、良い結果にならない恐れがあります。
テストの実施と進捗の確認
このように、多くのチームでは手動・自動のテストの両方を行う必要があると思います。テストマネジメントツールを使用すると、テストに関わるあらゆる管理を一括して行うことができます。Zephyr Enterprise Edition(以下ZephyrEE)は、大規模な開発案件に適用可能なテストマネジメントツールであり、表1の機能を持っています。
表1 ZephyrEEのおもな機能とメリット
カテゴリ | 機能 | メリット |
プロダクトの管理 | プロジェクトと、そのリリースを作成する | 複数製品のリリースを一括して管理できる
|
要件管理 | 要件を作成する | 要件とテストケースのトレーサビリティを確保し、検査漏れの発生を防ぐ |
要件とテストケースを関連付ける |
テストケースの作成 | テストケースを作成する | スプレッドシートではできない同時編集が可能 |
テストケースを複製する | テストケースの再利用性の向上 |
テスト計画の管理 | テスト計画(サイクル・フェーズ)を作成する | リリースに必要なテスト計画を策定できる |
テスト計画とテストケースを関連付ける |
テスト計画を実行する | テスト計画とテスト結果の関連付けや、エビデンスの保持ができる |
リソース管理 | テスト実施者の負荷状況を管理する | 計画の妥当性や現状の進捗を判断できる |
障害管理 | 検査により発覚した障害を記録できる | 障害とテストケースのトレーサビリティを確保し、障害の対応漏れを防ぐ |
テストケースと障害を関連付ける |
レポート | 各種メトリクスをリアルタイムに表示する | 各種の情報をトラッキングできる |
外部連携 | xUnitテストの結果を取り込む | テスト計画に対するユニットテストのエビデンスを保持できる |
インポート・エクスポート | 他システムからのデータ移行や報告用資料を作成できる |
外部ITSと連携する | テストマネジメントツール以外と連携できる |
ZephyrEEを使用して、テストケースを手作業でリポジトリに作成します。まず、テストケースの概要を記入し、その配下に手順と期待される結果を複数記入します。あらかじめ整理されたツリー構造にしておくと再利用性が高くなり、効率向上につながります。
ZephyrEEではテストの実施計画をサイクル、フェーズという単位で行います。プロダクトのリリースに対して複数のサイクルを作成し、各サイクルの中に複数のフェーズを作成できます。搭載される機能や開発規模はリリースごとに異なりますが、それに合わせた計画ができます。
サイクルはプロダクトのビルドに対応します。実施すべき一連のテストのグループを定義し、障害が見つかった場合は次のサイクルで巻き返しを図ります。フェーズでは、たとえば新機能のテスト、性能テスト、セキュリティテスト、全機能のスモークテストといった、サイクル中で実施するテストの分類を定義できます。さらにフェーズ内、たとえば「新機能のテスト」フェーズでは新機能Aのテスト、新機能Bのテスト、……といった具合にさらに詳細に落とし込みます。
リポジトリに作成しておいたテストケースをサイクルに取り込むことで、初めてテストを実行できる状態となります。実行中のサイクル・フェーズで実際にテストを行い、結果を記入します(図1)。
ZephyrEEとBambooを連携させると、テスト計画の中にユニットテストの結果も取り込めます。これにより、一連の手作業・自動のテスト結果のエビデンスを一括して管理できます。その際、D Software社がAtlassian Marketplaceで提供しているBamboo向けのアドオン「Zephyr Enterprise Add-on for bamboo」をインストールしておくと、ZephyrEEと連携するためのタスクをBambooのジョブの中に追加するだけで設定ができます。
テストの実施中はメトリクスを表示することで、テストの進捗、リソース状況をリアルタイムに確認できます。
おわりに
品質を向上させたプロダクトをいざ本番環境に配備するとうまく動作しなかった、という経験はありませんか? 次回は、修正したコードが本番環境で動かないという事態が発生しないようにするにはどうすべきかをテーマにする予定です。
日本だけでなく、アジア圏でもアトラシアン製品販売のトップエキスパートであるリックソフトのWebサイトでは、各アトラシアン製品の体験版を提供しているほか、アトラシアン製品専用のコミュニティも運営しています。まずはアクセスしてみては!
- リックソフトJIRAデモ環境
- https://www.ricksoft.jp/demo/
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識
- 第2特集
「知りたい」「使いたい」「発信したい」をかなえる
OSSソースコードリーディングのススメ
- 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画]Red Hat Enterprise Linux 9最新ガイド
- 短期連載
今さら聞けないSSH
[前編]リモートログインとコマンドの実行
- 短期連載
MySQLで学ぶ文字コード
[最終回]文字コードのハマりどころTips集
- 短期連載
新生「Ansible」徹底解説
[4]Playbookの実行環境(基礎編)