Spring Boot/開発/テスト/画面のテスト

Spring Boot/開発/テスト/画面のテスト

画面のテストは Java/Selenide で行う。

テストクラスはこのようになる

準備

Java/Selenide/セットアップ

Spring Boot での build.gradle はこうなる

dependencies {
    // 中略
    testImplementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
    testImplementation group: 'io.github.bonigarcia', name: 'webdrivermanager', version: '3.1.1'
    testImplementation group: 'com.codeborne', name: 'selenide', version: '5.1.0'
}

使ってみる

このようになる。

import static com.codeborne.selenide.Selenide.*;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;
 
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.WebDriverRunner;
 
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HogeTest {
    @LocalServerPort
    private int port;
 
    @Test
    public void hogeTest() throws Exception {
        Configuration.browser = WebDriverRunner.CHROME;
        open("http://localhost:" + port + "/hoge");
    }
}

webEnvironment を RANDOM_PORT と指定することにより裏でランダムなポート番号でアプリのサーバ、つまり内蔵の Tomcat が起動してくれる。そのポート番号は LocalServerPort アノテーションをつけたメンバに格納される。

あとは初期化で DB に値を突っ込んだり、それを Selenide で検証すればよい。

注意

SpringBootTest のアノテーション指定はデフォルトでこの画面環境が立ち上がるようには出来ているのだが、 画面と関係無いテストしたい場合は WebEnvironment.NONE でできるようになる。

しかし Spring Boot の HTTPSession 等をアプリ全体で使っていて Autowired されている場合画面環境が必要なくても NONE ではなく画面環境アリでテストを起動しないと動かないということがある。

これは Spring Boot 起動時に最上部のアプリ設定からその下位のコンポーネントを全部スキャンするためで、この中に Tomcat 依存のような HTTPSession等が入っているとそれが要求されるということだ。 つまりスキャンするコンポーネントを限定してやればいいのだが面倒ではある。

java/spring/spring_boot/dev/test/srceen_test/start.txt · 最終更新: 2019-07-01 12:29 by ore