JUnit Tips 「from JavaWorld 10月号 JUnitTips から」 [Test]
いくつか学ぶこともありましたので、備忘録の意味を含め2点纏めてみました。
- テストメソッドの名前に日本語の名前をつけることを検討する。
日本語を母国語として利用しているプログラマであれば、テストで用いるクラスやメソッドの名前に名前をつけるとテストの内容がよりわかり易く表現できます。よりわかり易く表現できるのであれば、日本語の名称(クラス名、メソッド名)を付与することを検討しても よいのではという考えです。
なんらかの副次的な問題が起こるのではと懸念してしまいますが、通常、他のプログラムからテストケースを参照することはない、つまり、テストケースクラスは他のクラスから基本的に非依存であるといえますので、クラス間の関係に起因する問題は起こりにくいと考えられます。
※ただし、クラス名に日本語を含めると環境(IDE, OS, ファイルシステム、 ビルドツール、各種自動化ツール、SCM)によっては正常に動作しない恐れがあるので、事前に検証をおこなうことが望ましいです。
懸念事項も残りましたが、この考えは当職にとっては思いつきもしない斬新な考えで新たな発想に繋がりました。適用可否、他の分野への応用を一度検討、検証してみる価値はありそうです。 - 配列やコレクションの検証
問題点:
JUnitの標準で実装されているメソッドでは配列の比較はできないため、検証をおこなうには、配列の中身を1つずつ比較する必要がある。ただし、工数やコードの可読性の低下に繋がる。
解決案:
ThirdParty提供の検証メソッドを利用する。
(1)JUnit-addonsのArrayAssertクラスを利用する。
例:
Object[] expected = ....;
Object[] actual = ....;
ArrayAssert.assertEquals("一致すべき", expected, actual);
(2)コレクションAPIの利用
格納順に依存しないかたちでListの中身を比較するには、要素の順序を持たないSetオブジェクトに格納しなおしてから比較する。
※ただし、同じ要素が複数個格納されている場合には、この方法では不正確な結果しか得られない。
例:
ArrayList expectedList = ....;
ArrayList actualList = ....;
assertEquals("一致すべき", new HashSet(expectedList), new HashSet(actualList));
(3)JUnit-addons の ListAssert の利用。
Listの要素を順不同で比較するメソッドおよび、特定の要素の存在を調べるメソッドがある。
例:
List expectedList = ....;
List actualList = ....;
ListAssert.assertEquals("一致すべき", expectedList, actualList);
(4)GSBaseの利用
Listの要素を順不同で比較する機能が用意されている。
JUnit-addon, GSBase にはこの他にも様々な機能があります。
検証用のロジックが必要になった場合は、このようなツールを流用可能か判断したうえでテストを進めるべきですね。
References
- GSBase:http://gsbase.sourceforge.net/
- JUnit-addon:http://sourceforge.net/projects/junit-addons
- JUnit Recipes:http://www.amazon.co.jp/exec/obidos/ASIN/1932394230/250-4248396-7498656
初めまして。
勉強させていただきます!
by 師子乃 (2018-11-11 10:23)