Observerパターンの事例

デザインパターンでランチャーを作成する 前回は、Template Methodパターンの事例を紹介しました。抽象クラスと具象クラスの継承関係をうまく活用したパターンでしたね。日ごろからよく使う基本的なテクニックなので、マスターしておきたいパターンの1つです。

中川 三千雄

2009年5月8日 20:00

デザインパターンでランチャーを作成する

 前回は、Template Methodパターンの事例を紹介しました。抽象クラスと具象クラスの継承関係をうまく活用したパターンでしたね。日ごろからよく使う基本的なテクニックなので、マスターしておきたいパターンの1つです。

 今回は前回と同様に、JUnit3.8.1(http://www.junit.org/)を事例に、Observerパターンを取り上げます。ObserverパターンはGoFのデザインパターンの1つで、振る舞いに分類されるパターンです。Observerとは「観察者」という意味です。観察対象になる被験者(Subject)の知りたい状態の変化を把握するのに有効なパターンです。ただし、観察といっても観察者が被験者を常に観察しているわけではありません。その実態は、被験者の状態が変化したときに観察者はその変化の通知を受けることで把握しています。

 JUnitでは、ユニットテストを実施するランチャーが用意されています。そのランチャーでは、実施状況を把握するのにObserverパターンが利用されています。観察者はBaseTestRunnerクラスから派生したTestRunnerクラス、被験者はTestResultクラスになります。JUnitでは、この2つのクラスの協調関係によって、ユニットテストの実施状況を把握しています。

 今回はこの2つのクラスに焦点を当てて、どのようにObserverパターンが適用されているのか、どのような効果があるのかを分析して理解を深めます。

必要なランチャーを考える

 前回はテスティングフレームワークが存在しなかったころのテスト手法の説明をしました。そのテスト手法では、テスト実施に関して次のような問題を抱えていました。

 ・実施したテストケースの数がわからない
 ・成功/失敗のときのステータスの表現が統一されていない
 ・実施結果から問題個所の特定が難しい

 今回はこれらの問題を解決するランチャーを作成します。


■実施結果のステータスは3つある
 テストケースには、テスト対象が仕様どおりに実装されていることを確認するためのコードを実装します。仕様どおりの場合は成功、そうでない場合は失敗と判断します。また、仕様の確認とは関係のない処理(テスト前、テスト後の処理)のバグでテストが中断するような場合はエラーとします。

 よって、テストケースの実装が正しい場合、実施結果のステータスは次の3つになります。
 ・成 功……仕様どおりである
 ・失 敗……仕様どおりでない(テスト対象のバグ)
 ・エラー……想定外のエラーが発生した(テストケースのバグ)


■テストの実施状況を把握する必要がある
 テストの実施状況を把握するためには、テストの進み具合や失敗/エラーの原因を知る必要があります。テストケースごとにテストの開始と終了のタイミングを知ることができればテストの進み具合を把握できます。また、失敗やエラーが発生したタイミングを知ることができれば、それらの原因を残すことができます。

 次のタイミングで必要な情報の収集や表示情報の更新ができるような仕組みを用意します。

 <タイミング>     <処理内容>
 テスト開始時   →  テストケースの件数の更新
 テスト終了時   →  今回は何もしない
 失敗時      →  失敗の原因の保存と件数の更新
 エラー発生時   →  エラーの原因の保存と件数の更新


■こんなランチャーを作成する
 まとめると、次のような責務を持ったクラスが必要になります。今回は、この2つのクラスを用いてランチャーを作成します。

●TestRunnerクラス
 ・ユニットテストの開始指示を行う
 ・ユニットテストの実施状況を把握し、表示情報を更新する

●TestResultクラス
 ・ユニットテストの実施結果を収集する
 ・テストケースごとに次のタイミングで表示情報の更新ができるような仕組みを用意する
  テスト開始時
  テスト終了時
  失敗時
  エラー発生時

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30