JUnitでテストケースの結果がFailでも実行を続けたいときは、ErrorCollectorを使う

私は普段SeleniumでGUIの自動テストをもにょもにょと書いているのですが、assertThatを使っていると期待値と実際の値が異なったときに、そこでテストケースの実行が止まってしまうので困るときがあります。

たとえば画面上の項目が20くらいあって、全部を期待結果と比較したいとき。期待値と異なる部分は全部一度に知りたいのですが、assertThatを使うとFailした時点で止まってしまい、その先にあるFailが見つけられません。

そんなときは、ErrorCollectorを使いましょう。

ErrorCollector

org.junit.rules.ErrorCollectorクラスを使うと、アサーションが失敗した場合でもテストの実行を継続することができます。

サンプルを用意しました。

package Example.example;

import static org.hamcrest.CoreMatchers.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

/**
 * Unit test for simple App.
 */
public class AppTest {
    private static WebDriver driver;

    public AppTest() {
    }

    @Rule
    public ErrorCollector errorcollector = new ErrorCollector();

    @Before
    public void before() {
        System.out.println("before start");
        System.setProperty("webdriver.chrome.driver", "/Users/yoshikiito/workspace/webdriver/chromedriver");
        driver = new ChromeDriver();
    }

    @Test
    public void Test() {
        System.out.println("test start");
        driver.get("http://google.com");
        errorcollector.checkThat("idがhogeの要素が1つ以上あること", driver.findElements(By.id("hoge")).size(), is(not(0)));
        errorcollector.checkThat("idがfooの要素が1つ以上あること", driver.findElements(By.id("foo")).size(), is(not(0)));
        errorcollector.checkThat("idがbarの要素が1つ以上あること", driver.findElements(By.id("bar")).size(), is(not(0)));
    }

    @After
    public void after() {
        driver.quit();
    }
}

ErrorCollectorクラスのインスタンスを生成し、checkThatメソッドを使っています。

上の例では、Googleのページを開いて、そこに「hoge」とか「foo」などのいい加減なidを探しにいかせています。
assertThatを使うと、一番目の「hoge」を探した時点で見つからずにテストが終了するはずですが、checkThatを使うとJUnitレポートに

java.lang.AssertionError: idがhogeの要素が1つ以上あること
Expected: is not <0>
but: was <0>
(中略)
java.lang.AssertionError: idがfooの要素が1つ以上あること
Expected: is not <0>
but: was <0>
(中略)
java.lang.AssertionError: idがbarの要素が1つ以上あること
Expected: is not <0>
but: was <0>
(中略)

と表示されます。このように、Failがあった時点では止まらず、続けてテストが行われています。

参考

この記事を書いた人

yoshikiito

都内でテストエンジニア&ブロガーをやっている@yoshikiitoです。

ソフトウェアエンジニアの学習方法や成長するための考え方、会社に依存せず自分の力で生きていけるエンジニアになる方法などについて興味があります。
こういった方法や考え方、自分が試したことなどをブログを通じて発信します。

仕事は主にソフトウェアテストやテスト自動化。
趣味は浦和レッズと読書と技術書を買って積むこと。

技術評論社から本を出すのが夢