2014年11月10日月曜日

TestNGで文字列の部分一致テストをする方法

概要

TestNGはJavaのテストフレームワークです
さまざまなAssertを使い、値を比較してテストが通ったかどうかを判定させます
ただ、TestNGが提供するAssertの種類に文字列の部分一致を行うテストがなく文字列に関しては完全一致によるテストしかありません
今回はTestNGで文字列の部分一致を実施する方法を紹介します

環境

  • Java 1.6 Over
  • TestNG 6.3.1

やり方

結論から記載すると以下のような感じで記載します

Assert.assertTrue(str.contains(expectedStr));

assertTrueとStringクラスのcontainsメソッドを使って実現します
assertTrueは引数がtrueの場合にテストを成功に倒してくれます
String クラスのcontainsメソッドは引数で指定した文字列が含まれている場合にtrueを返します
なのでこの組み合わせを使えば、文字列の部分一致によるテストが実現できます

ただ、この場合ちょっと残念なのは失敗した場合のログが「結果がtrueじゃなかったよ」と教えてくれるだけなので、比較した文字列の情報が何だったのかということまで教えてくれません

java.lang.AssertionError: expected:<true> but was:<false>
        at org.testng.Assert.fail(Assert.java:89)
        at org.testng.Assert.failNotEquals(Assert.java:489)
        at org.testng.Assert.assertTrue(Assert.java:37)
        at org.testng.Assert.assertTrue(Assert.java:47)

なので、比較した文字列の情報は別途ロギングする必要があります

TestNGを使う場合は上記でOKなのですが、そもそもTestNGを使わないというのも手です
Hamcrestというテストフレームワークがありこれを使えばcontainsStringというメソッドが使えこれが部分一致のテストになります
StackOverFlowにもそんな回答がありました
http://stackoverflow.com/questions/1092219/assertcontains-on-strings-in-junit

一番きれいなのはHamcrestを使う方法でしょうか
確かSpringIOでもテストフレームワークはJUnit+Hamcrestだったような記憶があります

1 件のコメント: