Adapterパターン - ECL:電子商取引研究室
Download
Report
Transcript 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