Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その17 )( unittest モードを作成してユニットテストのスピードアップ )
概要
Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その16 )( 検索/一覧画面 ( MyBatis-Spring版 ) 作成3 ) の続きです。
- 今回の手順で確認できるのは以下の内容です。
- unittest モードを作成してユニットテストのスピードアップを図ります。
ソフトウェア一覧
参考にしたサイト
手順
unittest モード用の設定ファイルの作成
IntelliJ IDEA 上で 1.0.x-unittestmode ブランチを作成します。
src/main/resources の下の application-product.properties をコピーして application-unittest.properties を新規作成します。内容は application-product.properties と同じままにします。
src/main/resources の下の logback-develop.xml をコピーして logback-unittest.xml を新規作成します。作成後、リンク先の内容 に変更します。
Application クラスの変更
ApplicationTest クラスの変更
- ApplicationTest クラスは @Ignore アノテーションを付加してテストが実行されないようにしていますが、"All Tests Passed" の緑色のメッセージが出なくなるので @Ignore アノテーションを削除してコメントアウトする方法に変更します。src/test/java/ksbysample/webapp/basic の下の ApplicationTest.java を リンク先の内容 に変更します。
「Run 'Tests in 'ksbysample...' with Coverage」のモードを unitest へ変更
IntelliJ IDEA のメインメニューから「Run」-「Edit Configurations...」を選択します。
「Run/Debug Configurations」ダイアログが表示されます。画面左側の「JUnit」の下に表示されている「All in ksbysample-webapp-basic」から始まる項目を全て削除します。
画面左側の「Defaults」の下の「JUnit」を選択後、画面右側の「VM options」の文字列を
-ea -Dspring.profiles.active=develop -Dlog4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
→-ea -Dspring.profiles.active=unittest
へ変更した後、「OK」ボタンをクリックしてダイアログを閉じます。「Run 'Tests in 'ksbysample...' with Coverage」を選択してテストを実行します。今度はログがほとんど出ずにテストが終了します。実行時間は 1分 30秒くらいから 30秒程度に短縮されました。
Gradle の test タスクのモードを unitest へ変更
build.gradle を リンク先の内容 に変更します。
test タスクを実行します。こちらもログがほとんど出ずにテストが終了します。
commit、GitHub へ Push、1.0.x-unittestmode -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-unittestmode ブランチを削除
commit の前に build タスクを実行し、BUILD SUCCESSFUL が表示されることを確認します。
commit、GitHub へ Push、1.0.x-unittestmode -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-unittestmode ブランチを削除、をします。
※commit 時に Code Analysis のダイアログが表示されますが、ApplicationTest クラス内の記述を全てコメントしたことに伴う Warning なので、無視して「Commit」ボタンをクリックします。
ソースコード
logback-unittest.xml
<?xml version="1.0" encoding="UTF-8"?> <included> <logger name="root" level="OFF"/> <!-- Spring MVC --> <logger name="org.springframework.web" level="OFF"/> <!-- log4jdbc-log4j2 --> <logger name="jdbc.sqlonly" level="OFF"/> <logger name="jdbc.sqltiming" level="OFF"/> <logger name="jdbc.audit" level="OFF"/> <logger name="jdbc.resultset" level="OFF"/> <logger name="jdbc.resultsettable" level="OFF"/> <logger name="jdbc.connection" level="OFF"/> </included>
<logger name="root" level="OFF"/>
を追加します。- level を全て OFF に設定します。
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <if condition='"${spring.profiles.active}" == "develop"'> <then> <include resource="logback-develop.xml"/> </then> </if> <if condition='"${spring.profiles.active}" == "unittest"'> <then> <include resource="logback-unittest.xml"/> </then> </if> <if condition='"${spring.profiles.active}" == "product"'> <then> <include resource="logback-product.xml"/> </then> </if> </configuration>
<if condition='"${spring.profiles.active}" == "unittest"'> ... </if>
の記述を追加します。
Application.java
package ksbysample.webapp.basic; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import java.text.MessageFormat; @SpringBootApplication public class Application { public static void main(String[] args) { String springProfilesActive = System.getProperty("spring.profiles.active"); if (!StringUtils.equals(springProfilesActive, "product") && !StringUtils.equals(springProfilesActive, "develop") && !StringUtils.equals(springProfilesActive, "unittest")) { throw new UnsupportedOperationException(MessageFormat.format("JVMの起動時引数 -Dspring.profiles.active で develop か unittest か product を指定して下さい ( -Dspring.profiles.active={0} )。", springProfilesActive)); } SpringApplication.run(Application.class, args); } }
- if 文の条件に
&& !StringUtils.equals(springProfilesActive, "unittest")
を追加します。 - エラー時のメッセージに
か unittest
を追加します。
ApplicationTest.java
package ksbysample.webapp.basic; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.springframework.boot.test.OutputCapture; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; public class ApplicationTest { /* @Rule public OutputCapture outputCapture = new OutputCapture(); @Test public void testApplicationProductMode() { String SPRING_PROFILES_ACTIVE = System.getProperty("spring.profiles.active"); System.setProperty("spring.profiles.active", "product"); Application.main(new String[]{"--server.port=8081"}); String output = this.outputCapture.toString(); assertThat(output.contains("Started Application"), is(true)); System.setProperty("spring.profiles.active", SPRING_PROFILES_ACTIVE); } @Test public void testApplicationDevelopMode() { String SPRING_PROFILES_ACTIVE = System.getProperty("spring.profiles.active"); System.setProperty("spring.profiles.active", "develop"); Application.main(new String[]{"--server.port=8082"}); String output = this.outputCapture.toString(); assertThat(output.contains("Started Application"), is(true)); System.setProperty("spring.profiles.active", SPRING_PROFILES_ACTIVE); } @Test public void testApplicationEmptyMode() { String SPRING_PROFILES_ACTIVE = System.getProperty("spring.profiles.active"); System.setProperty("spring.profiles.active", ""); try { Application.main(new String[]{"--server.port=8083"}); } catch (Exception e) { e.printStackTrace(); } String output = this.outputCapture.toString(); assertThat(output.contains("Started Application"), is(false)); assertThat(output.contains("JVMの起動時引数 -Dspring.profiles.active で develop か product を指定して下さい"), is(true)); System.setProperty("spring.profiles.active", SPRING_PROFILES_ACTIVE); } */ }
- クラス内の記述を全て / / で囲んでコメントアウトします。
build.gradle
test {
jvmArgs = ['-Dspring.profiles.active=unittest']
}
- spring.profiles.active に指定する文字列を
develop
→unittest
ヘ変更します。
履歴
2015/03/17
初版発行。