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
© Copyright 2024 ExpyDoc