menu
書いてる野郎
orebike@gmail.com
画面のテストは 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等が入っているとそれが要求されるということだ。 つまりスキャンするコンポーネントを限定してやればいいのだが面倒ではある。