するめごはんのIT日記

主にITネタを書いていくのさ

JUnitでassertじゃなくてErrorCollectorを使うという選択肢

ごきげんよう

showです。
風邪気味です つらぽよ。

今回は掲題の通り、JUnitを使ってるならばErrorCollectorってのも使えるよ という話。

E2E試験(受け入れ試験)でWebページのテストをするときにSeleniumを使うことは結構あるとして
それをJavaJUnitを使って実装しているとき、assertを使うことって結構あると思ってます。

けど、これ欠点があって
例えば、あるWebページにチェックする項目が3つあるとして
assertなんちゃらで上から3つチェックを書いた場合、
1つ目のassertで異常が見つかると、その場で動きが止まってしまう。

それはそれで正しいっちゃ正しいんだけど、これだと2つ目、3つ目の試験すべき箇所が正しいのか間違ってるのかを検証することができない。
ミッションクリティカルな試験だとこれはおそらく正しくて、止まるべきである場面もあるけど、そうでもない場合

1つ目で引っかかりましたー
デバッグしますー
直しましたー
再度試験を走らせましたー
2つ目で引っかかりましたー
デバッグしますー
直しましたー・・・・・・

って1つ1つやるのめっちゃ効率悪いと思ってます。
※そもそもバグを埋め込むのが悪いとかそういうのは別として。

そんな時にErrorCollector君が使えます。
この子をassertの代わりに使ってあげると、チェックしている箇所でfail扱いになってもJUnitは動き続けてくれます。
で、「これをチェックしたら期待値はこれだったけど、こうなってましたー」ってのがまとめて出力してくれる。

ってサンプルコードをここに記載しようと思ったら既に記事が存在した・・・w

yoshikiito.net

この記事では期待値が何で、結果こうなってますーってのが書いてあるんだけど
ここに書いてなくて、僕が個人的に使ってるやり方は

public class UseErrorCollector {

    @Rule
    public ErrorCollector errorcollector = new ErrorCollector();

     //Seleniumの設定類を書く

    @Test
    public void errorCollector() {

         //hogehoge画面のタイトルバーの文字列を確認する
            if(!(driver.findElement(By.id("hogehoge:id/titlebar_text")).getText().equals("こんにちは"))){

                     errorcollector.addError(new Throwable("試験No.XX hogehoge画面のタイトル文字列が「こんにちは」ではありません"));            

            }
       }
}
    

こんな感じです。

ErrorCollector にもやり方はいっぱいあるけれど、僕はこれでやることもあります。
なんでかっていうと、もともとassert文を使ってたけど、trueとfalseがごっちゃになる場合があって
かつ、うちのメンバーにプログラム書けないテスターさんもいるので、あんまりJUnitのassertシリーズを使い分けさせたくなかったから。
なのでif文で分けて、fail("hogehoge画面がーーー")って書いてた。
※サービスとかメンバーとかにもよる

正直、若干めんどいのも事実ではあるのですが、Seleniumを使ったコードを書いていると
自分でもたまに条件がよくわからんってなる時があったりするので、明示的にif文を書いてます。
なので最初にコメントで何を試験するのかを書いて、それに沿うようにif文を書いてる感じです。
テストコードがバグってるってのは、かなりよろしくないと思っていて、それを防止する意図も若干あります。

これをやると、「あぁこの試験やってんだな」ってのが他の人でもわかりやすい(気がする)。

はい。
こんなやり方もありますよってお話でした。