Selenium의 실행 시간을 JUnit의 ClassRule 어노테이션으로 가속화

7023 단어 JUnit셀레늄자바

소개



Selenium에서 테스트하고 있을 때, 테스트 메소드 단위로 브라우저의 기동/종료가 행해지는 것이 일반적(이라고 생각하고 있다).
다만 매번 브라우저를 다시 시작하면 실행 시간이 꽤 늘어나기 때문에 단축하고 싶었다.

방법은 여러 가지 있다고 생각하지만, 이번은 JUnit4의 ClassRule 어노테이션으로 해 보았다.
ClassRule에서 선언하면 WebDriver의 new/quit를 테스트 클래스 단위로 할 수 있으므로 나름대로 단축된다.

↓Rule/ClassRule에 대해서는, 이쪽이 알기 쉽게 정리해 주셨습니다.
ぃ tp // m / chaya / ms / d31 22b 또는 6df6c91793

구현



Rule 어노테이션을 이용하려면 전용의 클래스를 구현해, 테스트 메소드의 필드로 할 필요가 있다.
자세한 내용은 여기의 리포지토리 참조

규칙 측



ExternalResouce를 상속하여 클래스를 구현하고 클래스의 필드로 WebDriver를 생성합니다.
Override한 after 메소드가 junit의 후처리가 되므로 WebDriver의 quit를 after에 구현한다.

WebDriverRule.java
public class WebDriverRule extends ExternalResource {

    private WebDriver driver;
    public WebDriver getDriver() {
        return getInstance();
    }

    @Override
    protected void after() {
        this.driver.quit();
    }

    private WebDriver getInstance(){
        if(this.driver == null){
            this.driver = new ChromeDriver();
        }
        return this.driver;
    }
}

테스트 실행측



구현한 Rule 클래스는 @Rule@ClassRule 의 양쪽 모두로 사용할 수 있어 각각 이하와 같이 된다.
@ClassRule 에서 선언하면 before/after 가 클래스 단위의 전후처리에 상당하고 ( @BeforeClass@AfterClass )
@Rule 에서 선언하면 before/after 가 메소드 단위의 전후 처리에 상당한다 ( @setUp@tearDown )

Test.java
public class classSample {
    @ClassRule
    public static WebDriverRule dr = new WebDriverRule();

    @Test
    public void test(){
        WebDriver d = dr.getDriver();
        d.get("https://www.google.co.jp/");
        WebElement el = d.findElement(By.cssSelector("input[aria-label='検索']"));
        el.sendKeys("chrome test.");
    }
}

비교




위쪽이 @ClassRule , 아래쪽이 @Rule 에서 구현. 실행하는 테스트는 모두 동일합니다.
샘플로 만든 테스트 클래스에서는 10초 정도 차이가 있다.
ClassRule의 경우는 브라우저의 기동이 최초의 테스트 메소드 뿐이므로, 테스트 메소드가 많을수록 효과가 있다.
테스트 환경에서는 브라우저 기동에 5초 정도 걸렸다.

요약



테스트 대상에 따라 다르지만, 테스트 메소드마다 브라우저를 재시작하는 것은 과도한 경우가 많기 때문에 이렇게 해 두는 것이 좋다.
다만, 테스트 메소드간에 의존관계가 생겨도 눈치채기 어렵기 때문에(cookie에 정보가 남아 우연히 움직인다든가) 주의는 필요.

좋은 웹페이지 즐겨찾기