私は普段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があった時点では止まらず、続けてテストが行われています。

参考