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