Adapterパターン - ECL:電子商取引研究室

JUnitのデザインパターン
近畿大学 理工学部
情報学科 4年
電子商取引研究室所属
上田 翔太
発表内容
●
●
●
●
●
●
●
JUnitの簡単な動作説明
Template Methodパターン
Commandパターン
Adapterパターン
Compositeパターン
Decoratorパターン
まとめ
JUnit実行手順(おさらい)
1. TestCaseクラスのサブクラスを作る。
2. Fixtureを表すインスタンス変数を追加する。
3. Fixtureの初期化コードをsetUpメソッドに、終了コード
をtearDownメソッドに書く。
4. assertを使って、testXXXXという名前のテストメソッド
を作る。
5. 各テストメソッドを集めたsuiteクラスメソッドを作る。
6. TestRunnerでテストを実行 。
Template Methodパターン
●
概念

Template とは、文字の形に穴があいている薄いプラ
スチックの板。

その文字穴から幾多のオブジェクトが考えられる。(
色違いや組み合わせ)

抽象クラスにおいて、そのTemplateのアルゴリズム(
メソッドの流れ)を定義提供する。

具象クラスで定義された抽象クラスのアルゴリズム
を実装する。
Template Methodパターン
●
●
AbstractClassのtemplateMethodで複数のmethodを組合
せ任意のアルゴリズムを定義する。
Dbアクセスする場合、open、DB処理、closeが順次処理
される。

手順を個々メソッドとしAbstractClassを形成する。
Template Methodパターン
●
●
SampleTestクラス : ConcreteClass(具象クラス)役
TestCaseクラス : AbstractClass(抽象クラス)役
●
メソッド

setUp : テスト前処理

runTest

tearDown : テスト後処理

run
: テスト実行
: 上3つを順次実行
Template Methodパターン
●
Fixtureについて

●
テスト対象となるオブジェクト
Template Methodパターンとの関連


Fixtureをフィールドとして定義
setUpメソッド
: テスト前にFixtureの初期化
runTestメソッド
: Fixtureを使ったテスト実行

tearDownメソッド

: Fixtureのあとかたづけ
Compositeパターン
●
概念
 複合物という意味を持つ。
 「容器と中身を同一視する」ことで、再帰
的なデータ構造の取り扱いを容易にする。
 例として、ファイルシステムやHTML文書
などが挙げられる。
Compositeパターン
●
Leafクラスは「中身」を表す役。木構造でいう「子」とみな
す。
Compositeクラスは「容器」を表す役。木構造でいう「親」
●
とみなす。
Componentオブジェクトは「中身」と「容器」を同一視する
●
役。双方の共通メソッドを定義する。
Compositeパターン
●
Componentクラスを継承や実装することにより同一視を
実現。

CompositeクラスでLeafと更にCompositeオブジェク
トを持つため。
Compositeパターン
●
●
●
Testクラス
:
TestSuiteクラス :
TestCaseクラス :
Component役
Composite(複合体)役
Leaf(葉)役
TestSuite suite = new TestSuite();
suite.addTest(new
SampleTestA("testA"));
suite.addTest(new
SampleTestB("testB"));
suite.run();
Commandパターン
●
概念





一つのクラスメソッドをオブジェクト(命令)として捉
えクラス化をする。
複雑で多種多様なメソッドが存在する場合に用いら
れることが多い。
追加命令に対して容易に対応可能。
オブジェクト(命令)をさらに複数容易に組み合わせる
事が可能。
インスタンス管理がしやすい。
Commandパターン
●
●
CommandインターフェイスはAPIを定義し、他のクラスに提供す
る。
実際にインスタンス化されるのはConcreteCommand(実装)クラス
となる。
●
ConcreteCommandクラスで任意の実行処理を実装する。
Commandパターン
●
●
ConcreteCommandクラスで処理される対象オブジェクトが
Receiverクラスとなる。
すなわち、ConcreteCommandクラスのexecuteメソッドで実行さ
れる際に処理されるオブジェクトである。
Commandパターン
●
TestCaseクラスがCommandインターフェイス役にあた
る。

●
●
テスト自動実行のためのAPIを提供する。
SampleTestクラスでCommandインターフェイスのAPIを
実装する。
SampleTestクラスのテストメソッド一つをオブジェクト
としてCommandパターンを適応している。
Adapterパターン
●
概念

「適合させるもの」という意味を持つ。

提供されたAPIに互換性のないクラス間を結びつ
けることが目的。

Adapterパターンには以下の2通りパターンがあ
る。
●
継承による適合(class adapter)
●
委譲による適合(object adapter)
Adapterパターン
●
委譲による適合

Targetクラスは適合対象役。

Adapteeクラスは適合される役。

Adapterクラスは適合する役。
➔
AdapterはAdapteeインスタンスを持ち、targetMethodが実
行されるとAdaptee.method()を実行する。
Adapterパターン
●
SamleTestクラスはAdapter(適合)役。
 TestCaseクラスのAPIとCommandパターンで抽出された
SampleTestAクラスを適合する。

テストメソッドがその対象となる。
Adapterパターン
●
●
TestCaseクラスはTarget(対象)役
 自動テスト実行の枠組みをAPIとして提供する。
SampleTestAクラスはAdaptee(被適合)役

実際にテストを実行するクラス。
Decratorパターン
●
概要

「装飾者」の意味を持つ。

飾り枠と中身をComposite同様に同一視するが、
目的は違うので間違えないように。

それによって柔軟な機能拡張方法を提供できる。

よく似た機能を気づかぬうちに拡張されやすい。
Decoratorパターン
●
●
Componentオブジェクトは機能を追加するときの中身(核)と
なる役。中身(核)となるAPIを定義する。
ConcreteComponentクラスはComponentのAPIを実装する役
。
Decoratorパターン
●
●
Decoratorオブジェクトは「装飾者」役で、Component(中身)
を持つ。
ConcreteDecoratorクラスはDecoratorを実装する役。

Component(中身)に機能を拡張する。
Decoratorパターン
●
Testオブジェクト

●
Component役。
TestDecoratorクラス

Decorator役。

通常のTestに多様な機能を追加するため
のAPIを提供する。

任意の機能を被実行テストクラスに追加
を施す。
●
ConcreteTestDecratorクラス
 ConcreteDecrator役。
 TestDecoratorのAPIを実装する。
Decoratorパターン
●
RepeatedTestクラス

任意のTestSuiteを繰り返し行う際に使用する。

繰り返し回数は指定可能。
Test test = new
RepeatedTest(SampleTest.suite(), 100);
junit.textui.TestRunner.run(test);
Decoratorパターン
●
TestSetupクラス

TestSuiteでFixtureの初期化や後処理を共有したい
際に用いられる。

DBアクセス処理を共有する場合、TestSetupクラ
スを継承したTestDBSetupクラスを用意し以下の
ように実行させる。
Test test = new
TestDBSetup(SampleTest.suite());
junit.textui.TestRunner.run(test);
まとめ
●
基本はCommandパターンである。

●
テストの準備と後片付けにTemplate Methodパターンを
使っている。

●
テストクラスであるTestCaseがCommandクラス。
TestCase.runメソッドはsetUp、runTest、tearDown の順
に実行される。
個々のテストをまとめて扱うことができるよう
Compositeパターンを使っている。

TestSuiteクラスがCompositeクラス。
まとめ
●
テストコードのインターフェイスの統一するため、
Adapterパターンを使っている。

●
テストメソッドをrunTest メソッドに変換した Adapterが
簡単に作れる。
テストクラスを拡張するためDecoratorパターンを使っ
ている。

TestDecoratorをテストクラスにかぶせる。
参考資料
●
デザインパターン

●
結城浩著「Java言語で学ぶデザインパターン入門」
JUnitのデザインパターン

Junit: A Cook's Tour
●

http://junit.sourceforge.net/doc/cookstour/cookstour.htm
Kent Beck Testing Framework 入門
●
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/
testing-framework.html