読者です 読者をやめる 読者になる 読者になる

かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その17 )( unittest モードを作成してユニットテストのスピードアップ )

概要

Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その16 )( 検索/一覧画面 ( MyBatis-Spring版 ) 作成3 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。

ソフトウェア一覧

参考にしたサイト

手順

unittest モード用の設定ファイルの作成

  1. IntelliJ IDEA 上で 1.0.x-unittestmode ブランチを作成します。

  2. src/main/resources の下の application-product.properties をコピーして application-unittest.properties を新規作成します。内容は application-product.properties と同じままにします。

  3. src/main/resources の下の logback-develop.xml をコピーして logback-unittest.xml を新規作成します。作成後、リンク先の内容 に変更します。

  4. src/main/resources の下の logback.xmlリンク先の内容 に変更します。

Application クラスの変更

  1. src/main/java/ksbysample/webapp/basic の下の Application.javaリンク先の内容 に変更します。

ApplicationTest クラスの変更

  1. ApplicationTest クラスは @Ignore アノテーションを付加してテストが実行されないようにしていますが、"All Tests Passed" の緑色のメッセージが出なくなるので @Ignore アノテーションを削除してコメントアウトする方法に変更します。src/test/java/ksbysample/webapp/basic の下の ApplicationTest.javaリンク先の内容 に変更します。

「Run 'Tests in 'ksbysample...' with Coverage」のモードを unitest へ変更

  1. IntelliJ IDEA のメインメニューから「Run」-「Edit Configurations...」を選択します。

  2. 「Run/Debug Configurations」ダイアログが表示されます。画面左側の「JUnit」の下に表示されている「All in ksbysample-webapp-basic」から始まる項目を全て削除します。

    f:id:ksby:20150317001428p:plain

  3. 画面左側の「Defaults」の下の「JUnit」を選択後、画面右側の「VM options」の文字列を -ea -Dspring.profiles.active=develop -Dlog4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator-ea -Dspring.profiles.active=unittest へ変更した後、「OK」ボタンをクリックしてダイアログを閉じます。

    f:id:ksby:20150317012140p:plain

  4. 「Run 'Tests in 'ksbysample...' with Coverage」を選択してテストを実行します。今度はログがほとんど出ずにテストが終了します。実行時間は 1分 30秒くらいから 30秒程度に短縮されました。

    f:id:ksby:20150317003500p:plain

Gradle の test タスクのモードを unitest へ変更

  1. build.gradle を リンク先の内容 に変更します。

  2. test タスクを実行します。こちらもログがほとんど出ずにテストが終了します。

commit、GitHub へ Push、1.0.x-unittestmode -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-unittestmode ブランチを削除

  1. commit の前に build タスクを実行し、BUILD SUCCESSFUL が表示されることを確認します。

  2. 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 に指定する文字列を developunittest ヘ変更します。

履歴

2015/03/17
初版発行。