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

## 参考

 - [java – Continuing test execution in junit4 even when one of the asserts fails – Stack Overflow][1]
 - JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

 [1]: https://stackoverflow.com/questions/10221891/continuing-test-execution-in-junit4-even-when-one-of-the-asserts-fails